Kelas pengecualian apa yang ada di pustaka C ++ standar

102

Apa kelas pengecualian yang termasuk dalam pustaka C ++ standar, dan untuk apa mereka harus digunakan? Saya tahu ada beberapa pengecualian C ++ 11 baru, tetapi saya tidak yakin apa itu atau di mana mereka.

Mooing Duck
sumber

Jawaban:

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

Sumber: http://en.cppreference.com/w/cpp/error/exception
Dalam praktiknya, sebagian besar pengecualian adalah pengecualian khusus yang berasal dari logic_errordanruntime_error . Bukan berarti ini diabaikan, tetapi banyak pengecualian yang spesifik untuk domain.

Ingatlah bahwa pengecualian harus mencerminkan apa yang salah dan bukan siapa yang melemparkannya. (Tidak ada "MyProgramException")

Mooing Duck
sumber
bad_function_call, domain_error, and future_errordi msdn mereka yang terburuk dicontohkan dan dijelaskan :(
Tuan Anubis
bad_function_calldilempar ketika Anda memiliki objek std :: function yang dibangun secara default dan Anda mencoba memanggil fungsi yang dibungkusnya. Karena tidak ada fungsi yang dibungkus, tidak ada yang perlu dipanggil.
Pete Becker
1
bad_function_calldilemparkan saat Anda mencoba memanggil std::functionyang belum siap (alias, dibuat default atau secara eksplisit dihapus melalui nullptr). future_errordigunakan bila Anda melanggar salah satu dari banyak prasyarat fungsi untuk promisedan future. Dan domain_error(dalam teori) untuk kasus di mana input ke suatu fungsi berada di luar rentang valid untuk fungsi itu (seperti angka negatif untuk std::sqrt).
Dave S
future_errordilemparkan oleh berbagai operasi di masa depan ketika operasi yang diminta tidak valid atau akan membuat objek menjadi tidak valid. Ini adalah hal baru di C ++ 11, dan saya tidak bisa memasukkan tutorial dalam komentar.
Pete Becker
3
cppreference mencantumkan kelas turunan dari std::exception, dan mencatat apakah kelas tersebut C ++ 11 (khususnya, std::ios_base::failuredipindahkan dari std::exceptionke std::system_error). Penggunaan dan tajuk berjarak satu tautan.
ecatmur
50

Lihat situs ini

masukkan deskripsi gambar di sini

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.
TemplateRex
sumber
Ini bagus, tetapi pengecualian C ++ 11 tidak ada, dan tidak menunjukkan pengecualian mana yang ada di header mana.
Mooing Duck
3
@MooingDuck Pertanyaan Anda telah diberi tag c++, bukan c++11, dan semuanya berada dalam satu<stdexcept>
TemplateRex
6
C ++ artinya apapun versi terbarunya, sedangkan C ++ 11 dan C ++ 03 adalah pertanyaan tentang versi spesifik tersebut . pertanyaan saya bukan tentang versi tertentu, hanya info terbaru tentang C ++. Bagaimanapun, saya akan mengedit pertanyaan untuk menyebutkan C ++ 11. Juga, tidak semua kesalahan-kesalahan yang di <stdexcept>seperti yang ditunjukkan oleh ideone.com/uqM6h
melenguh Bebek
1
@MooingDuck Jika tidak ditanya secara spesifik, maka jawaban untuk C ++ 03 sama validnya dengan C ++ 11 dan sebaliknya. Itu adalah tanggung jawab Anda untuk memberikan semua informasi yang diperlukan. Anda tidak boleh berharap mendapatkan jawaban berkualitas dari pertanyaan yang buruk. Titik.
Phil1970
std::logic_errortidak std::logic_failure. Diagram itu salah!
Galaxy