Những lớp ngoại lệ nào trong thư viện C ++ chuẩn


102

Các lớp ngoại lệ được bao gồm trong thư viện C ++ chuẩn là gì và chúng nên được sử dụng để làm gì? Tôi biết có một vài ngoại lệ C ++ 11 mới, nhưng tôi không chắc chúng là gì hoặc chúng ở đâu.

Câu trả lời:


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

Nguồn: http://en.cppreference.com/w/cpp/error/exception
Trong thực tế, hầu hết các ngoại lệ là các ngoại lệ tùy chỉnh bắt nguồn từ logic_errorruntime_error. Không phải những điều này bị bỏ qua, nhưng nhiều ngoại lệ là miền cụ thể.

Hãy nhớ rằng một ngoại lệ sẽ phản ánh những gì đã xảy ra và không phải ai đã ném nó. (Không có "MyProgramException" s)


bad_function_call, domain_error, and future_errortrên MSDN họ đang exampled tồi tệ nhất và giải thích :(
Mr.Anubis

bad_function_callđược ném ra khi bạn có một đối tượng std :: function được xây dựng mặc định và bạn cố gắng gọi hàm mà nó kết thúc. Vì không có hàm được bọc nên không có gì để gọi.
Pete Becker 13:12

1
bad_function_callđược ném ra khi bạn cố gắng gọi std::functionnó chưa sẵn sàng (hay còn gọi là, được xây dựng mặc định hoặc được xóa rõ ràng qua nullptr). future_errorđược sử dụng khi bạn vi phạm một trong nhiều điều kiện tiên quyết của các hàm cho promisefuture. Và domain_errorlà (về lý thuyết) đối với các trường hợp đầu vào cho một hàm nằm ngoài phạm vi hợp lệ cho hàm đó (chẳng hạn như một số âm cho std::sqrt).
Dave S

future_errorđược ném bởi các hoạt động khác nhau trên tương lai khi hoạt động được yêu cầu không hợp lệ hoặc sẽ đưa đối tượng vào trạng thái không hợp lệ. Đây là nội dung mới trong C ++ 11 và tôi không thể phù hợp với hướng dẫn trong một nhận xét.
Pete Becker

3
cppreference liệt kê các lớp dẫn xuất của std::exceptionvà lưu ý xem chúng có phải là C ++ 11 hay không (cụ thể là được std::ios_base::failurechuyển từ std::exceptionsang std::system_error). Cách sử dụng và tiêu đề là một liên kết.
ecatmur

50

Xem trang web này

nhập mô tả hình ảnh ở đây

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.

Điều này là tốt, nhưng thiếu các ngoại lệ C ++ 11 và không hiển thị ngoại lệ nào trong các tiêu đề.
Mooing Duck, 13:12

3
@MooingDuck Câu hỏi của bạn đã được gắn thẻ c++, không phải c++11và tất cả đều giống nhau<stdexcept>
TemplateRex

6
C ++ có nghĩa là bất kể phiên bản mới nhất là gì, trong khi C ++ 11 và C ++ 03 là câu hỏi về các phiên bản cụ thể đó . câu hỏi của tôi không phải về một phiên bản cụ thể, chỉ là thông tin cập nhật nhất về C ++. Dù bằng cách nào, tôi sẽ chỉnh sửa câu hỏi để đề cập đến C ++ 11. Ngoài ra, không phải tất cả những sai sót được trong <stdexcept>như thể hiện bởi ideone.com/uqM6h
Mooing Duck

1
@MooingDuck Nếu không được hỏi cụ thể, thì câu trả lời cho C ++ 03 cũng hợp lệ như câu trả lời cho C ++ 11 và ngược lại. Bạn có trách nhiệm cung cấp tất cả các thông tin cần thiết. Bạn đừng bao giờ mong đợi nhận được câu trả lời chất lượng từ câu hỏi kém. Giai đoạn = Stage.
Phil1970

std::logic_error, không phải std::logic_failure. Sơ đồ đó sai!
Galaxy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.