Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры(ооп) кроме 45,46,52.docx
Скачиваний:
2
Добавлен:
24.09.2019
Размер:
117.21 Кб
Скачать

27. Исключительные ситуации.Основы обработки исключительных ситуаций

Обработка исключительных ситуаций лишена недостатков вышеназванных методов реагирования на ошибки. Этот механизм позволяет использовать для представления информации об ошибке объект любого типа. Поэтому можно, например, создать иерархию классов, которая будет предназначена для обработки аварийных событий. Это упростит, структурирует и сделает более понятной программу.

Рассмотрим более подробно элементы try, catch и throw механизма обработки исключений.

Блок try. Синтаксис блока:

try{ охранный код }

список обработчиков

Необходимо помнить, что после ключевого слова try всегда должен следовать составной оператор, т.е. после try всегда следует {…}. Блоки try не имеют однострочной формы, как, например, операторы if, while, for.

Еще один важный момент заключается в том, что после блока try должен

следовать, по крайней мере, хотя бы один обработчик.

Обработчики исключительных ситуаций catch. Обработчики исключи-

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

catch(тип 1 <аргумент>){

тело обработчика

}

catch(тип 2 <аргумент>)){

тело обработчика

}

. . .

catch(тип N <аргумент>)){

тело обработчика }

28. Задание собственного неожиданного обработчика

Так же как и обработчик terminate(), обработчик unexpected() позволяет

перед завершением программы выполнить какие-то действия. Но в отличие от обработчика завершения неожиданный обработчик может сам генерировать исключительные ситуации. Таким образом, собственный неожиданный обработчик может сгенерировать исключительную ситуацию, на этот раз уже входящую в спецификацию. Установка собственного неожиданного обработчика выполняется с помощью функции set_unexpected(). Приведенная ниже программа демонстрирует применение спецификации исключений и перехват неожиданных исключительных ситуаций с помощью собственного обработчика.

#include <iostream>

using namespace std;

#include <exception>

class first{};

class second : public first{};

class third : public first{};

class my_class{};

void my_unexpected()

{ cout<<"my_unexpected handler"<<endl;

throw third(); // возбуждение исключения типа объект

} // класса third

void f(int i) throw(first) // указание спецификации исключения

{ if(i ) throw second(); //

else throw my_unexpected();

}

int main()

{ set_unexpected(my_unexpected);

try {

f(1);

}

catch(first) {

cout<<"first handler"<<endl;

}

catch(my_class) {

cout<<"my_class handler"<<endl;

}

try{

f(0);

}

catch(first) {

cout<<"first handler"<<endl;

}

catch(my_class) {

cout<<"my_class handler"<<endl;

}

return 0;

}

Результат выполнения программы:

first handler

my_unexpected handler

first handler

В данной программе вызов функции f() во втором блоке try приводит к

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

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