2016-12-09 5 views
0

Ich bin nicht so vertraut mit der Ausnahmebehandlung so könnte mir jemand bei diesem Problem helfen ?? Also für dieses Programm, in dem Fall eines nicht vorhandenen Schlüssels in der std :: map, möchte ich etwas werfen, aber ich weiß nicht was.Ausnahmebehandlung. Wie wirft man einen Iterator?

der Kartenschlüssel, wenn es existiert wird eine Telefonnummer (String), aber wenn es nicht existiert, was wäre es?

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

Was ist der Typ von 'Iter'? Das ist es, was du fangen musst. Nicht, dass es in deinem Fall wirklich wichtig wäre, da es immer gleich 'phone_map.end()' ist. Ich schlage vor, dass Sie [eine der Standardausnahmeklassen] (http://en.cppreference.com/w/cpp/error) verwenden und vielleicht Ihre eigene basierend auf einer Standardklasse zusammenstellen. –

+0

Auch zu Ihrer Information: Während die Verwendung von Ausnahmen nur einen vernachlässigbaren Einfluss auf die Leistung hat, wenn keine Ausnahmen ausgelöst werden, haben Ausnahmen in C++ einen erheblichen Einfluss auf die Leistung, wenn Sie eine werfen und abfangen. Ausnahmen sollten nur in Ausnahmefällen verwendet werden. Die Nichtvalidierung von Benutzereingaben ist normalerweise kein solcher Ausnahmefall. –

+0

Ich denke, das ist ein schlechtes Beispiel für die Ausnahmebehandlung. Sie brauchen hier keinen Try-Catch-Block. –

Antwort

1

Daumenregel - Sie immer eine abgeleitete Klasse von std::exception, werfen, wenn nicht anders von einem gewissen Style Guide angegeben. Sie können bereits definierte allgemeine Ausnahmen wie std::runtime_error verwenden. Und übergeben Sie Fehlerdaten als Ausnahmeargument, das ist der ganze Punkt von Ausnahmen - propagieren die Fehlerdaten.

Und immer durch const-Referenz fangen.

In Ihrem Fall könnten Sie einfach tun:

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; 
} 

In Ihrem Fall, dass Sie einen Iterator werfen können, und wie diese fangen:

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

Aber dies wird nicht empfohlen.

0

Ich würde sagen, dass Sie in dieser besonderen Situation keine Ausnahmen werfen müssen. Der Name der Funktion bedeutet aus Sicht des Lesers wahrscheinlich, dass die einzige Aufgabe der Funktion darin besteht, zu prüfen, ob ein solches Element in der Karte vorhanden ist oder nicht. Die Rückgabe eines Wertes durch eine Ausnahme ist sehr merkwürdig (und ineffizient). Hier würde ich std::map::count verwenden - es gibt 1 zurück, wenn dieser Wert in der Karte ist, und andernfalls 0.

Wenn Sie wirklich eine Exception auslösen müssen, wenn der Wert fehlt, sehen Sie sich std::map::at() an. Es wird eine std::out_of_range Ausnahme ausgelöst, wenn der Schlüssel nicht vorhanden ist.

Weitere Informationen über std::map::at() und andere Methoden zum Abrufen von Informationen aus std::map finden Sie unter this.

Verwandte Themen