Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
63
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать

Если программа не может найти подходящий обработчик для сгенериро- ванной исключительной ситуации, то будет вызвана процедура завершения terminate() (ее также называют обработчиком завершения), по умолчанию вы-

полнение программы будет остановлено и на экран будет выведено сообщение «Abnormal program termination». Однако можно установить собственный обра- ботчик завершения, используя функцию set_terminate(), единственным аргумен- том которой является указатель на новую функцию завершения (функция, при- нимающая и возвращающая void), а возвращаемое значение указатель на пре-

дыдущий обработчик. Ниже приведен пример установки собственного обработ-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Р

чика завершения и генерации исключительной ситуации, для которой не может

быть найден обработчик.

 

 

 

 

 

 

 

 

 

#include <iostream>

 

 

 

 

 

У

 

 

using namespace std;

 

 

 

 

 

 

И

 

#include <exception>

 

 

 

 

 

 

 

#include <stdlib.h>

 

 

 

 

 

 

 

void my_term()

 

 

 

 

Б

 

 

 

 

{

cout<<"Собственная функция-обработчик";

 

 

 

 

}

exit(1);

 

 

 

 

а

Г

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

к

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

 

set_terminate(my_term);

 

 

 

 

 

 

 

 

 

 

try {

 

 

е

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

throw 1;

// ген рация ис лючительной ситуации типа int

 

 

}

 

 

т

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

catch(char) {

// брабо чик для типа

char

 

 

 

 

 

 

 

cout<<"char handler";

 

 

 

 

 

 

 

 

 

}

и

 

 

 

 

 

 

 

 

 

 

 

return 0;

о

 

 

 

 

 

 

 

 

 

}

 

 

л

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

Со ственная функция-обработчик

 

 

 

 

 

и

 

 

 

 

 

 

 

 

 

 

 

 

Б

б8.6. Спецификации исключительных ситуаций

 

 

 

Иногда возникает необходимость заранее указать, какие исключения мо-

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

объявление функции throw(тип1, тип2,…){тело функции}

179

где тип1, тип2,… − список типов, которые может иметь выражение throw внут- ри функции. Если список типов пуст, то компилятор полагает, что функцией не будет выполняться никакой throw.

void fun(char c) throw();

Использование спецификации исключительных ситуаций не означает, что

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

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

Р

У

 

Так же как и обработчик 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 {

180

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 приводит к

тому, что генерируе ся исключиельная ситуация,

тип которой не указан в спе-

цификации, поэт му вызывае ся установленный нами неожиданный обработ-

чик, где происход

генерация исключения, которая успешно обрабатывается.

 

 

 

т

 

 

о

8.8. Иерарх я сключений стандартной библиотеки

Вершиной

ерархии является класс exceptioh (определенный в заголовоч-

 

ит

 

л

 

 

б

 

 

 

ном фай е <exception>). В этом классе содержится функция what(), переопреде- ляемая в каждом производном классе для выдачи сообщения об ошибке.

Б

Непосредственными производными классами от класса exception являют-

ся классы runtime_error и logic_error (определенные в заголовочном файле

<stdexcept>),и

имеющие по несколько производных классов.

Производными от exception также являются исключения: bad_alloc, гене-

рируемое оператором new, bad_cast, генерируемое dynamic_cast, и bad_typeid,

генерируемое оператором typeid.

Класс logic_error и производные от него классы (invalid_argument,

length_error,

out_of_range) указывают на логические ошибки (передача непра-

вильного аргумента функции, выход за пределы массива или строки).

Класс

runtime_error и производные от него (overflow_error и

 

181

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