2016-12-09 11 views
0

私は例外処理にあまり慣れていないので、誰かがこの問題を手伝うことができますか?だから、このプログラムでは、std :: mapの中に存在しないキーを入れて、何かを投げたいのですが、私は何を知っていません。例外処理。どのようにしてイテレータを投げますか?

地図キーが存在する場合は電話番号(文字列)になりますが、存在しない場合は何ですか?親指の

class SmartCarrier{ 
private: 
    string carrier_name_; 
    map<string,vector<Message*>> accounts_map; 
public: 
    Search(); 
} 

void phone::Search{ 

    string phone_number; 


    map<string,vector<Message*>>::iterator iter; 


    cout << "Enter a phone number: "; 
    getline(cin,phone_number); 

try{ 
    iter = phone_map.find(phone_number); 

    if (iter ==phone_map.end()) { 
     //Incase of a non-existing phone number what do I throw? 
     throw iter; 
    } 

} 
catch(/*iter ??? what should the block catch as a value?*/){ 
    cout << "Phone number not found." << endl; 
} 
+0

「iter」の種類は?それはあなたが捕まえる必要があるものです。あなたの場合は本当に重要ではありません。なぜなら、常に 'phone_map.end()'と等しいからです。おそらく標準クラスに基づいて自分自身を構成する、[標準例外クラスの1つ](http://en.cppreference.com/w/cpp/error)を使用することをお勧めします。 –

+0

また、あなたの情報のために:例外をスローしない限り例外を使用するとパフォーマンスにはほとんど影響しませんが、C++の例外はスローしてキャッチするとパフォーマンスに大きな影響を与えます。例外は*例外的な場合にのみ使用してください。通常、ユーザー入力の検証に失敗した場合は例外ではありません。 –

+0

これは例外処理の悪い例だと思います。ここでtry-catchブロックは必要ありません。 –

答えて

1

ルール - いくつかのスタイルガイドで特に明記していない場合は常に、std::exceptionの派生クラスを投げます。 std::runtime_errorのように、既に定義されている共通の例外を使用できます。そして、エラーデータを例外引数として渡してください、それは例外の全体のポイントです - エラーデータを伝播してください。

常にconst-referenceをキャッチします。あなたのケースでは

あなたは単に行う可能性があります:

try { 
    auto iter = phone_map.find(phone_number); 
    if (iter == phone_map.end()) { 
     throw std::runtime_error{ "Incorrect phone number" }; 
    } 
} catch(const std::exception& e){ 
    cout << e.what() << endl; 
} 

は、あなたのケースでは、イテレータを投げることができ、このようにキャッチ:

try { 
    throw phone_map.end(); 
} catch (const map<string,vector<Message*>>::iterator& e) { 
    // Do Something 
} 

をしかし、これはお勧めしません。

0

この特定の状況では、例外をスローする必要はありません。関数の名前は、読者の観点からは、おそらく関数の唯一の責任は、そのような要素がマップにあるかどうかをチェックすることだけであることを意味します。例外によって値を返すことは、非常に奇妙な(そして非効率的な)方法です。ここではstd::map::countを使用します。その値がマップにある場合は1、それ以外の場合は0を返します。

値の不一致の場合に例外をスローする必要がある場合は、std::map::at()を参照してください。キーが存在しない場合は、std::out_of_range例外がスローされます。

std::map::at()とその他の検索情報の方法については、std::mapからthisを参照してください。

関連する問題