Универсальный обработчик исключений 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Универсальный обработчик исключений



В одном блоке try можно вызывать исключения разных типов. В этом случае после блока try должны следовать обработчики для исключений каждого типа. Вы можете определить обработчик, обслуживающий исключения всех типов. Для этого вместо типа в операторе catch надо указать три точки:

catch(...)

{

...

}

Исключения в языке Си++ могут быть различного типа, в том числе они могут быть объектами классов. Вы можете определить несколько обработчиков исключений различного типа. В этом случае исключение будет обрабатывать обработчик соответствующего типа.

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

Вы можете определить собственную функцию, которая будет вызываться перед аварийным завершением программы. Для этого вы должны вызвать функцию set_terminate, указав ей в качестве параметра имя вашей функции. Если вы воспользуетесь функцией set_terminate несколько раз, то будет вызываться только функция, указанная в последнем вызове set_terminate.

#include <eh.h>

#include <iostream.h>

#include <process.h>

 

void FastExit(void);

 

int main()

{

// Устанавливаем функцию term_func

set_terminate(FastExit);

 

try

{

//...

 

// Вызываем исключение типа int

throw (int) 323;

 

//...

}

 

// Определяем обработчик типа char. Обработчик исключений

// типа int и универсальный обработчик не определены

catch(char)

{

cout << "Exception " << endl;

}

return 0;

}

 

// Определение функции FastExit

void FastExit()

{

cout << "Exception handler not found" << endl;

exit(-1);

}

Среда Visual C++ позволяет запретить или разрешить обработку исключений языка Си++. Для управления исключениями выберите из меню Build строку Settings. На экране появится диалоговая панель Project Settings, в которой определяются все режимы работы. Выберите страницу C/C++. Затем из списка Category выберите строку C++ Language. Чтобы включить обработку исключительных ситуаций установите переключатель Enable exception handling.

 

Иерархии исключений

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

class Matherr;

class Overflow: public Matherr; // переполнение

class Underflow: public Matherr; // исчезновение порядка

class ZeroDivide: public Matherr; // деление на ноль

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

Существует ряд стандартных исключение, которые генерируются операциями или функциями С++. Все они являются производными от библиотечного класса exception, описанного в заголовочном файле <stdexcept>. Например операция new при неудачном выделении памяти генерирует исключение типа bad_alloc.

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

 

Таблица 31.1 - Стандартные исключения, вызываемые логическими ошибками

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

 

Динамические исключения выведены из базового класса runtime error. Они приведены в таблице 31.2

 

Таблица 31.2 – Динамические исключения

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

 

Контрольные вопросы:

1. Что такое исключение и исключительная ситуация?

2. Как организуется обработка исключительных ситуаций?

3. Какие возможны исключительные ситуации при работе программ?



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 198; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.39.74 (0.005 с.)