Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

7.3. Специальные средства поддержки механизма исключений

В С++ имеется набор стандартных средств для поддержки механизма исключений. К ним относятся специальные типы, переменные и функции, а также иерархия классов исключений.

Как было указано выше, при отсутствии подходящего обработчика для исключения вызывается функция terminate, которая, в свою очередь, передает управление функции abort, принудительно завершающей программу. Эта функция входит в стандартную библиотеку С++ и описана в заголовочном файле exceptio.h. Функция terminate также вызывается и в ряде других случаев: например, когда при развязке стека в деструкторе одного из объектов возникает исключение или когда возбуждается исключение в конструкторе или деструкторе нелокального объекта, или же при попытке ретранслировать с помощью оператора throw; несуществующий объект-исключение.

Программист может переопределить функцию terminate, более точно, назначить вместо нее собственную функцию. Задать собственную функцию взамен terminate можно стандартной функцией set_terminate. Эта функция при вызове возвращает указатель на старую функцию terminate и принимает указатель на новую. Новая функция должна задаваться указателем предопределенного типа terminate_function, который описан в заголовочном файле except.h следующим образом:

typedef void (* terminate_function) ();

Как видно из этого описания, определяемая функция не должна принимать параметров и возвращать значений.

Прототип функции set_terminate() выглядит следующим образом:

terminate_function set_terminate(terminate_function func_name);

Следует отметить, что новая функция завершения не должна возвращать управление в вызвавшую ее функцию и генерировать новых исключений, а должна просто завершать выполнение программы после реализации некоторых пользовательских действий.

Ниже дан пример введения новой функции завершения.

Пример

#include<stdlib.h>

#include<except.h>

...

void new_terminate() // новая функция

{

... // пользовательский код

abort();

}

void main()

{

// задание указателя на новую функцию

terminate_function p_new_terminate = new_terminate;

terminate_function p_old_terminate = set_terminate(p_new_terminate);

...

throw; // генерация исключения вне контролируемых блоков

// вызывается функция new_terminate()

...

}

Еще одной стандартной функцией поддержки исключений является функция unexpected. Функция unexpected вызывается в случае возникновения в некоторой функции не предусмотренного ее спецификацией исключения. Функция unexpected не имеет параметров и не возвращает значений, но может генерировать и даже ретранслировать исключения. Если передаваемое из нее исключение согласуется с ранее нарушенной спецификацией, то поиск обработчика исключения продолжается. Если же не согласуется, то возможны два случая: 1) при отсутствии в нарушенной спецификации исключения std::bad_exception вызывается функция terminate; 2) при наличии std::bad_exception текущее необработанное исключение замещается исключением std::bad_exception и поиск обработчика продолжается уже для него.

Функция unexpected, как и terminate, может быть замещена пользовательской функцией. Для задания собственного варианта функции unexpected необходимо вызвать функцию set_unexpected с прототипом вида:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]