Welche Ausnahmeklassen befinden sich in der Standard-C ++ - Bibliothek?


102

Welche Ausnahmeklassen sind in der Standard-C ++ - Bibliothek enthalten und wofür sollten sie verwendet werden? Ich weiß, dass es einige neue C ++ 11-Ausnahmen gibt, bin mir aber nicht sicher, was sie sind oder wo sie sind.

Antworten:


124
std::exception <exception> interface (debatable if you should catch this)
    std::bad_alloc <new> failure to allocate storage
        std::bad_array_new_length <new> invalid array length
    std::bad_cast <typeinfo> execution of an invalid dynamic-cast
    std::bad_exception <exception> signifies an incorrect exception was thrown
    std::bad_function_call <functional> thrown by "null" std::function
    std::bad_typeid <typeinfo> using typeinfo on a null pointer
    std::bad_weak_ptr <memory> constructing a shared_ptr from a bad weak_ptr
    std::logic_error <stdexcept> errors detectable before the program executes
        std::domain_error <stdexcept> parameter outside the valid range
        std::future_error <future> violated a std::promise/std::future condition
        std::invalid_argument <stdexcept> invalid argument
        std::length_error <stdexcept> length exceeds its maximum allowable size
        std::out_of_range <stdexcept> argument value not in its expected range
    std::runtime_error <stdexcept> errors detectable when the program executes
        std::overflow_error <stdexcept> arithmetic overflow error.
        std::underflow_error <stdexcept> arithmetic underflow error.
        std::range_error <stdexcept> range errors in internal computations
        std::regex_error <regex> errors from the regular expression library.
        std::system_error <system_error> from operating system or other C API
            std::ios_base::failure <ios> Input or output error

Quelle: http://en.cppreference.com/w/cpp/error/exception
In der Praxis sind die meisten Ausnahmen benutzerdefinierte Ausnahmen, die von logic_errorund abgeleitet sind runtime_error. Nicht dass diese vernachlässigt werden, aber dass viele Ausnahmen domänenspezifisch sind.

Denken Sie daran, dass eine Ausnahme widerspiegeln sollte, was schief gelaufen ist und nicht, wer sie geworfen hat. (Keine "MyProgramException")


bad_function_call, domain_error, and future_errorauf msdn sind sie am schlechtesten untersucht und erklärt :(
Mr.Anubis

bad_function_callwird ausgelöst, wenn Sie ein standardmäßig erstelltes std :: function-Objekt haben und versuchen, die darin eingeschlossene Funktion aufzurufen. Da es keine umschlossene Funktion gibt, gibt es nichts aufzurufen.
Pete Becker

1
bad_function_callwird ausgelöst, wenn Sie versuchen std::function, einen nicht bereitgestellten Aufruf aufzurufen (auch bekannt als standardmäßig erstellt oder explizit über nullptr gelöscht). future_errorwird verwendet, wenn Sie eine der vielen Voraussetzungen der Funktionen für promiseund verletzen future. Und domain_errorist (theoretisch) für Fälle, in denen die Eingabe in eine Funktion außerhalb des gültigen Bereichs für diese Funktion liegt (z. B. eine negative Zahl für std::sqrt).
Dave S

future_errorwird durch verschiedene Operationen auf Futures ausgelöst, wenn die angeforderte Operation ungültig ist oder das Objekt in einen ungültigen Zustand versetzen würde. Dies ist neu in C ++ 11, und ich kann kein Tutorial in einen Kommentar einfügen.
Pete Becker

3
cppreference listet die abgeleiteten Klassen von auf std::exceptionund stellt fest, ob es sich um C ++ 11 handelt (insbesondere std::ios_base::failurevon std::exceptionnach verschoben std::system_error). Verwendung und Header sind nur einen Link entfernt.
ecatmur

50

Siehe diese Seite

Geben Sie hier die Bildbeschreibung ein

Exception               Description
===================================
std::exception          An exception and parent class of all the standard C++ exceptions.
std::bad_alloc          This can be thrown by new.
std::bad_cast           This can be thrown by dynamic_cast.
std::bad_exception      This is useful device to handle unexpected exceptions in a C++ program
std::bad_typeid         This can be thrown by typeid.
std::logic_error        An exception that theoretically can be detected by reading the code.
std::domain_error       This is an exception thrown when a mathematically invalid domain is used
std::invalid_argument   This is thrown due to invalid arguments.
std::length_error       This is thrown when a too big std::string is created
std::out_of_range       This can be thrown by the at method from for example a std::vector and std::bitset<>::operator[]().
std::runtime_error      An exception that theoretically can not be detected by reading the code.
std::overflow_error     This is thrown if a mathematical overflow occurs.
std::range_error        This is occured when you try to store a value which is out of range.
std::underflow_error    This is thrown if a mathematical underflow occurs.

Dies ist gut, es fehlen jedoch die C ++ 11-Ausnahmen und es wird nicht angezeigt, welche Ausnahmen in welchen Headern enthalten sind.
Mooing Duck

3
@MooingDuck Ihre Frage wurde markiert c++, nicht c++11, und sie befinden sich alle im selben<stdexcept>
TemplateRex

6
C ++ bedeutet, was auch immer die neueste Version ist, während C ++ 11 und C ++ 03 Fragen zu diesen spezifischen Versionen sind . Meine Frage bezieht sich nicht auf eine bestimmte Version, sondern nur auf die aktuellsten Informationen zu C ++. In jedem Fall werde ich die Frage bearbeiten, um C ++ 11 zu erwähnen. Außerdem sind nicht alle dieser Fehler vorhanden, <stdexcept>wie von ideone.com/uqM6h
Mooing Duck

1
@MooingDuck Wenn nicht speziell gefragt, ist eine Antwort für C ++ 03 genauso gültig wie eine für C ++ 11 und umgekehrt. Es lag in Ihrer Verantwortung, alle erforderlichen Informationen bereitzustellen. Sie sollten niemals erwarten, qualitativ hochwertige Antworten von schlechten Fragen zu erhalten. Zeitraum.
Phil 1970

std::logic_errornicht std::logic_failure. Das Diagramm ist falsch!
Galaxy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.