5.06. Иерархия исключений стандартной библиотеки C++
Иерархия исключений стандартной библиотеки C++
Стандартная библиотека C++ определяет небольшой набор встроенных типов исключений, все из которых находятся в заголовке <stdexcept>. Кроме того, в языке допускается выбрасывать любые типы (включая примитивы, строки, пользовательские объекты), но для совместимости и читаемости рекомендуется использовать только типы, производные от std::exception.
Иерархия исключений стандартной библиотеки C++ (C++20 / C++23)
Все стандартные исключения наследуются от std::exception (заголовок <exception>).
Корневой класс:
std::exception
Прямые подклассы std::exception:
-
std::logic_error— ошибки, которые могут быть обнаружены до выполнения (логические ошибки):std::domain_errorstd::invalid_argumentstd::length_errorstd::out_of_range
-
std::runtime_error— ошибки, возникающие во время выполнения и зависящие от условий среды:std::range_errorstd::overflow_errorstd::underflow_errorstd::regex_error(C++11+)std::system_error(C++11+) — используется для ошибок системного уровня (например, при работе с потоками, файлами, сокетами). Содержит код ошибки (std::error_code).- Некоторые реализации могут порождать
std::ios_base::failureкак подклассstd::system_error(начиная с C++11).
- Некоторые реализации могут порождать
-
std::bad_alloc— ошибка выделения памяти (newне смог выделить память). Наследуется напрямую отstd::exception. -
std::bad_cast— ошибка при неверном использованииdynamic_cast(заголовок<typeinfo>). -
std::bad_typeid— ошибка при использованииtypeidс нулевым указателем на полиморфный объект. -
std::bad_function_call(C++11+) — выбрасывается при вызове пустогоstd::function. -
std::bad_weak_ptr(C++11+) — выбрасывается при созданииshared_ptrиз пустогоweak_ptr. -
std::bad_variant_access(C++17+) — выбрасывается при некорректном доступе кstd::variant. -
std::bad_any_cast(C++17+, из<any>) — выбрасывается при ошибке приведения типа вstd::any. -
std::ios_base::failure— исключение, связанное с операциями ввода-вывода. До C++11 наследовалось отstd::exception, начиная с C++11 — отstd::system_error.
Другие важные исключения, не входящие в стандартную иерархию:
-
Исключения, связанные с многопоточностью (C++11+):
std::future_error— при ошибках работы сstd::future/std::promise.
-
Исключения, генерируемые реализацией:
- Некоторые компиляторы могут генерировать дополнительные исключения (например, при переполнении стека), но это не стандартизировано.
Особенности модели исключений в C++:
- Нет обязательной обработки: в отличие от Java, компилятор не требует перехвата исключений.
- Произвольные типы: можно писать
throw 42;илиthrow "error";, но это считается плохой практикой. - Рекомендация: все исключения должны наследоваться от
std::exceptionи переопределять виртуальную функцию.what(). - Безопасность исключений: часть стандартной библиотеки помечена как nothrow (например, деструкторы по умолчанию), чтобы избежать двойного исключения.
Как получить список программно:
C++ не предоставляет средств интроспекции типов во время выполнения для перечисления всех исключений. Список фиксирован спецификацией языка и зависит от версии стандарта (C++98, C++11, C++17, C++20, C++23).