2010-05-16 5 views
14

Gibt es einen Verweis auf C++ - Standardbibliotheksausnahmen? Ich will nur wissen, welche Funktionen eine Ausnahme auslösen können oder nicht.C++ Standardbibliothek Ausnahmeliste?

+0

Related: http://StackOverflow.com/Questions/11938979/What-Exception-Classes-are-in-the-Standard-CLibrary –

Antwort

19

Tatsächlich werfen die meisten Standardbibliotheksfunktionen keine Ausnahmen selbst. Sie geben nur Ausnahmen weiter, die von Benutzercode ausgelöst werden, der von ihnen aufgerufen wird. Wenn Sie beispielsweise ein Element zu einem Vektor push_back() haben, kann dies (aufgrund von Speicherzuordnungsfehlern und) auslösen, wenn der Kopierkonstruktor des Objekts auslöst.

einigen bemerkenswerten Ausnahmen (kein Wortspiel beabsichtigt), wo Bibliotheksfunktionen werfen sind:

  • Einige Methoden out_of_range werfen, wenn der bereitgestellte Index ist ungültig:
    • std::vector<>::at()
    • std::basic_string<>::at()
    • std::bitset<>::set(), reset() und flip().
  • Einige Verfahren werden std::overflow_error auf ganzzahlige Überlaufwurf:
    • std::bitset<>::to_ulong() und (C++ 0x) to_ullong().
  • std::allocator<T> auf std::bad_alloc von new geworfen geben, die sie aufruft.
  • Streams können so eingerichtet werden, dass std::ios_base::failure ausgelöst werden, wenn ein Statusbit gesetzt ist.
  • Große Zuweisungen Array können std::bad_array_new_length
  • dynamic_cast auf einem Referenz werfen einen std::bad_cast (technisch nicht Teil der Standardbibliothek) werfen kann
  • eine ungültige Ausnahme von einer Funktion mit einer Ausnahme-Spezifikation Werfen ein std::bad_exception
  • werfen Rufen Sie eine std::function::operator(...) auf, wenn es keinen Wert hat, wird std::bad_function_call geworfen.
  • Mit typeinfo eines Null-Pointer kann eine std::bad_typeid werfen.
  • Der Zugriff auf eine weak_ptr nach der Veröffentlichung der Pointe wird eine std::bad_weak_ptr werfen.
  • Falsche Verwendung von std::promise/std::future kann eine std::future_error werfen.
  • (C++ 11) Die String-Umwandlungsfunktionen std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod und std::stold können beide std::invalid_argument und std::out_of_range werfen.
  • (C++ 11) In der Regex-Familie können Konstruktoren und Assign-Methoden std::regex_error werfen.

(Ich mache dieses eine CW Antwort, also wenn jemand von mehr so ​​denken kann, wenden Sie sich bitte sie hier anhängen.)

Auch für die 3. Ausgabe von Die C++ Programmiersprache, Bjarne Stroustrup hat eine herunterladbare appendix about exception safety, die relevant sein könnte.

+0

+1 für den Link. Ich habe gerade angefangen, es zu lesen. –

+0

Danke für Ihre Antwort. Übrigens, was ist die CW-Antwort? – Brian

+0

@Brian: Es ist "Community Wiki". Anderen steht es frei, jede CW-Antwort zu bearbeiten (auch wenn sie nicht die Möglichkeit haben, Antworten normal zu bearbeiten). – sbi

1

Die einzigen Funktionen garantiert (durch den Compiler) Funktionen nicht zu werfen, die die throw() Ausnahme der Spezifikation, wie folgt aus:

void ThisFunctionNeverThrows() throw() 
{ 
} 

Andernfalls eine andere Funktion möglicherweise eine Ausnahme auslösen kann, es sei denn sie spezifisch sind anders dokumentiert. Beim Schreiben von Code angesichts von Ausnahmen müssen Sie die Ausnahmesicherheit berücksichtigen.

Siehe Artikel von Bjarne Stroustup über Ausnahmesicherheit und die Standardbibliothek: http://www2.research.att.com/~bs/3rd_safe.pdf Ab Seite 19 im PDF finden Sie Informationen über Garantien, die von den Standardcontainern gestellt werden.

+0

Dies ist nicht korrekt, da viele Container, z.B. garantieren Sie, dass Sie 'Erase()' nicht einfügen, aber diese Funktion ist nicht 'throw()'. Aus der Sicht der Sprache macht das, was Sie geschrieben haben, Sinn, aber es gibt andere Garantien als die, die vom Compiler erzwungen werden. – doublep

+0

@doublep: 'erase()' * wird * werfen, wenn der Kopierkonstruktor des Elementtyps auslöst. – kennytm

+0

Ab Seite 21 in der PDF erwähnt ich (Garantien für "Vektor" und "Deque"): "Wenn nicht durch den Kopierkonstruktor oder den Zuweisungsoperator des Elementtyps ausgelöst wird, löst keine' erase() 'eine Ausnahme aus." –

Verwandte Themen