Опыт показывает, что исключения можно четко разделить на ряд категорий. Стандартная библиотека C++ реализует иерархию классов исключений.
Вершиной иерархии является базовый класс exception (определенный в
заголовочном файле <exception>), который содержит функцию what(),
переопределяемую в каждом производном классе для выдачи соответствующего
сообщения об ошибке.
Непосредственными производными классами базового класса exception
являются runtime_error и logic_error (оба определены в заголовочном файле
<stdexcept>), каждый из которых имеет несколько производных классов.
Кроме того, производными от exception являются исключения, генерируемые
операциями C++, например, bad_alloc, которое выбрасывается операцией new
(раздел 16.11), bad_cast, выбрасываемое операцией dynamiccast (глава 13)
и bad_typeid, выбрасываемое typeid (глава 13). Если включить в список throw
функции спецификацию bad_exception, то при появлении
непредусмотренного исключения unexpected сможет выбрасывать bad_exception — вместо
завершения программы (по умолчанию) или вызова другой функции,
|
|
зарегистрированной в set_unexpected.
Класс logic_error является базовым классом нескольких стандартных
классов исключений, указывающих на ошибки в программной логике. Класс
invalid_argument указывает, что функции был передан недопустимый
аргумент. (Правильное написание кода может, конечно, предотвратить передачу
функции недопустимых аргументов). Класс length_error указывает, что для
объекта была использована длина, большая максимально допустимой для
объекта, над которым выполняются манипуляции. Класс out_of_range
указывает, что значение, например, индекса массива находится вне допустимого
диапазона.
Класс runtime_error является базовым классом нескольких других
стандартных классов исключений, указывающих на ошибки времени выполнения.
Класс overflow_error указывает на ошибку арифметического переполнения
(т.е. результат арифметической операции превосходит максимальное число,
которое может хранить компьютер). Класс underflow_error указывает на ошибку
исчезновения арифметического порядка (т.е. результат арифметической
операции меньше минимального числа, которое может хранить компьютер).