Исключения в языке C++

В стандартной библиотеке C++ определены два заголовка, которые имеют отношение к обработке исключительных ситуаций, или исключений: <exception> и <stdexcept>. Исключения используются для сигнализации об ошибочных условиях. Рассмотрим эти заголовки подробнее.

<exception>

Заголовок <exception> определяет классы, типы и функции, которые связаны с обработкой исключений. Вот как выглядят определения классов.

Копировать
class exception {
public:
	exception() throw();
	exception(const bad_exception &ob) throw();
	virtual -exception() throw();
	exception &operator=(const exception &ob) throw();
	virtual const char *what(() const throw();
};

class bad_exception: public exception {
public:
	bad_exception() throw();
	bad_exception(const bad_exception &ob) throw();
	virtual ~bad_exception() throw();
	bad_exception &operator=(const bad_exception &ob) throw();
	virtual const char *what(() const throw();
};

Класс exception - это базовый класс для всех исключений, определенных стандартной библиотекой C++. Класс bad_exception представляет собой тип исключения, генерируемого функцией unexpected(). В каждом из этих классов функция-член what() возвращает указатель на строку с завершающим нулевым символом, которая описывает соответствующее исключение.

Класс exception - это базовый класс для всех исключений, определенных стандартной библиотекой C++. Класс bad_exception представляет собой тип исключения, генерируемого функцией unexpected(). В каждом из этих классов функция-член what() возвращает указатель на строку с завершающим нулевым символом, которая описывает соответствующее исключение.

Из класса exception выведен ряд других важных классов. Класс bad_alloc используется в случае неудачного выполнения оператора new. Класс bad_typeid оказывается полезным при попытке выполнения недопустимого выражения typeid. Наконец, класс bad_cast используется при попытке выполнить неверную операцию динамического приведения типа. Эти классы содержат те же члены, что и класс exception.

Ниже приводятся типы, определенные в заголовке <exception>.

Тип Значение
terminate_handler typedef void(*terminate_handler)();
unexpected_handler  typedef void(*unexpected_handler)();

В следующей таблице перечислены функции, определенные в заголовке <exception>.

Функция Назначение
terminate_handler set_terminate(terminate_handler fn) throw(); Устанавливает функцию, заданную параметром fn, в качестве обработчика завершения работы. Возвращает указатель на прежний обработчик завершения
unexpected_handler set_unexpected(unexpected_handler fn) throw(); Устанавливает функцию, заданную параметром fn, в качестве обработчика непредвиденного исключения. Возвращает указатель на прежний обработчик непредвиденного исключения
void terminate(); Вызывает обработчик завершения, когда не обработано фатальное исключение. По умолчанию вызывает функцию abort()
bool uncaught_exception(); Возвращает значение true, если исключение не перехвачено
void unexpected(); Вызывает обработчик непредвиденного исключения, если функция генерирует неразрешенное исключение. По умолчанию вызывает функцию terminate()

<stdexcept>

Заголовок <stdexcept> определяет ряд стандартных исключений, которые могут быть сгенерированы библиотечными функциями C++ и/или системой времени выполнения. Существует два общих типа исключений, определяемых заголовком <stdexcept>: логические ошибки и ошибки времени выполнения(динамические ошибки). Логические ошибки обязаны своим существованием программистам. Динамические ошибки возникают из-за наличия ошибок в библиотечных функциях или системе времени выполнения и не подвластны контролю со стороны программиста.

Определенные в языке C++ стандартные исключения, вызываемые логическими ошибками, выведены из базового класса logic_error. Они приведены в следующей таблице.

Исключение Причина возникновения
domain_error Возникла ошибка домена
invalid_argument  В вызове функции использован неверный аргумент
length_error Была предпринята попытка создания слишком большого объекта
out_of_range Аргумент функции не попал в требуемый диапазон

Перечисленные ниже динамические исключения выведены из базового класса runtime error.

Исключение Причина возникновения
overflow_error Возникло арифметическое переполнение
range_error Возникла ошибка внутреннего диапазона
underflow error  Возникла потеря значимости