Quali classi di eccezione sono nella libreria C ++ standard


102

Quali sono le classi di eccezione incluse nella libreria C ++ standard e per cosa dovrebbero essere utilizzate? So che ci sono alcune nuove eccezioni C ++ 11, ma non sono sicuro di cosa siano o dove siano.

Risposte:


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

Fonte: http://en.cppreference.com/w/cpp/error/exception
In pratica, la maggior parte delle eccezioni sono eccezioni personalizzate derivate da logic_erroreruntime_error . Non che questi vengano trascurati, ma che molte eccezioni sono specifiche del dominio.

Tieni presente che un'eccezione dovrebbe riflettere ciò che è andato storto e non chi l'ha lanciato. (Nessuna "MyProgramException")


bad_function_call, domain_error, and future_errorsu msdn sono i peggiori esempi e spiegati :(
Mr.Anubis

bad_function_callviene generato quando si dispone di un oggetto std :: function predefinito e si tenta di chiamare la funzione che racchiude. Poiché non esiste una funzione di wrapping, non c'è nulla da chiamare.
Pete Becker

1
bad_function_callviene lanciato quando si tenta di invocare std::functionche non è pronto (aka, predefinito costruito o esplicitamente cancellato tramite nullptr). future_errorviene utilizzato quando si viola una delle tante precondizioni delle funzioni per promisee future. Ed domain_errorè (in teoria) per i casi in cui l'input di una funzione è al di fuori dell'intervallo valido per quella funzione (come un numero negativo per std::sqrt).
Dave S

future_errorviene lanciato da varie operazioni sui futures quando l'operazione richiesta non è valida o metterebbe l'oggetto in uno stato non valido. Questa è roba nuova in C ++ 11 e non riesco a inserire un tutorial in un commento.
Pete Becker

3
cppreference elenca le classi derivate di std::exceptione osserva se sono C ++ 11 (in particolare, std::ios_base::failurespostate da std::exceptiona std::system_error). L'utilizzo e l'intestazione sono a un link di distanza.
ecatmur

50

Vedi questo sito

inserisci qui la descrizione dell'immagine

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.

Ciò è positivo, ma mancano le eccezioni C ++ 11 e non mostra quali eccezioni si trovano in quali intestazioni.
Mooing Duck

3
@MooingDuck La tua domanda è stata taggata c++, no c++11, e risiedono tutte nello stesso<stdexcept>
TemplateRex

6
C ++ significa qualunque sia l'ultima versione, mentre C ++ 11 e C ++ 03 sono domande su quelle versioni specifiche . la mia domanda non riguarda una versione specifica, solo le informazioni più aggiornate su C ++. Ad ogni modo, modificherò la domanda per menzionare C ++ 11. Inoltre, non tutti questi errori sono <stdexcept>come mostrato da ideone.com/uqM6h
Mooing Duck

1
@MooingDuck Se non espressamente richiesto, una risposta per C ++ 03 è valida quanto una per C ++ 11 e viceversa. Era tua responsabilità fornire tutte le informazioni necessarie. Non dovresti mai aspettarti di ottenere risposte di qualità da una domanda scadente. Periodo.
Phil1970

std::logic_error, no std::logic_failure. Quel diagramma è sbagliato!
Galaxy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.