Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

13. Потеря исключений. Неперехваченное исключение. Использование функций terminate() и set_terminate().

После того как исключение сгенерировано, у него есть две возможности вызвать проблемы. Если исключение сгенерировано в функции, имеющей спецификацию исключения, то оно должно соответствовать одному из типов в списке спецификации. Вспомните, что в иерархии наследования тип класса соответствует объектам этого класса и производных от него классов. Если исключение не соответствует спецификации, то оно называется непредвиденным исключением и по умолчанию приводит к остановке программы. Хотя в С++11 спецификации исключений объявлены устаревшими, они по-прежнему остались в языке и кое-где в существующем коде. Если исключение преодолевает не является непредвиденным, то оно должно быть перехвачено. Если исключение не перехвачено, что может произойти при отсутствии блока try или соответствующего блока catch, то оно называется неперехваченным исключением. По умолчанию такое исключение приводит к остановке программы. Однако можно изменить реакцию программы на непредвиденные и неперехваченные исключения. Посмотрим, как это делается, и начнем с неперехвачениого исключения.

Неперехваченное исключение не приводит к немедленному останову программы. Вместо этого программа сначала обращается к функции по имени terminate(). По умолчанию функция terminate() вызывает функцию abort(). Но можно изменить поведение функции terminate(), зарегистрировав функцию, которую terminate() будет вызывать вместо abort(). Для этого необходимо вызвать функцию set_terminate(). Обе функции, terminate() и set_terminate(), объявлены в заголовочном файле exception:

Функция set_terminate() принимает в качестве аргумента имя функции (т.е. ее адрес) без аргументов. После вызова set_terminate() возвращает адрес функции, зарегистрированной перед этим. Если вызвать функцию set_terminate() более одного раза, то terminate() вызовет функцию, зарегистрированную самым последним вызовом set_terminate().

Предположим, что потребовалось неперехватываемое исключение, которое выводит сообщение об этом, затем вызывает функцию exit() с состоянием завершения в 5. Сначала потребуется включить в проект заголовочный файл exception. Объявления этого файла можно сделать доступными с помощью директивы using, подходящих объявлений using или просто квалификатора std::.

#include <exception> using namespace std;

После этого нужно создать функцию, которая выполняет два требуемых действия и имеет подходящий прототип:

void myQuit() { cout<<"Прекращение работы программы из-за необработанного исключения\n"; exit (5);

}

И, наконец, в начале программы необходимо указать эту функцию как выбранное действие завершения программы:

set_terminate(myQuit);

В результате, если исключение будет сгенерировано и не перехвачено, программа вызовет terminate(), a terminate() вызовет MyQuit().