Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Надейкина_ПРОГРАММИРОВАНИЕ_лабы9_10_11_new.doc
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
129.42 Кб
Скачать

Int main () {

try {

cout<<" GCD (66, 44) = "<< GCD (66, 44) <<endl;

cout<<" GCD (0, 7) = "<< GCD (0, 7) <<endl;

cout<<" GCD (-12, 8) = "<< GCD (-12, 8) <<endl;

}

catch (data d) {

cout << d.s << " x= " << d.n << ", y= " << d.m;

}

return 0;

}

Результат:

GCD (66, 44) = 22

zero! x=0, y=7

Первый вызов выполнится без проблем. Во втором вызове первый параметр имеет нулевое значение. Соответственно будет выброшено исключение в виде объекта класса data, параметрами конструктора которого, являются значения чисел и строка zero!

Обработчик, получив такой объект, выводит сначала строку, а потом значения параметров. После обработки исключения управление передается первому оператору, находящемуся непосредственно за обработчиками исключений.

Поэтому третий вызов GCD (-12, 8) не будет выполнен!

Исключения в программе определены как объекты специального класса data. Объекты класса data формируются внутри одной функции, но доступны внутри другой.

Это особое свойство исключений. Они создаются как временные статические объекты в одном блоке, но доступны в другом.

Что касается определения класса объектов исключений, то следует отметить, что оно не обязательно размещается в глобальном пространстве имен, как класс data.

Следовательно, при спецификации параметра обработчика (ловушки) исключений для обозначения типа параметра должна использоваться форма:

имя_пространства_имен :: имя_класса.

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

Ниже представлен листинг программы.

#include <iostream>

using namespace std;

class zero_divide { }; //класс объектов исключений

class overflow { }; // класс объектов исключений

//-------определение функции деления-------------

double div (double n, double d) {

if (d= =0.0&&n= =0.0) throw 0.0;

if (d= =0) throw zero_divide ();

double b=n/d;

if (b>1e+30) throw overflow ();

return b;

}

double x=1e-20, z=1e+20, w=0.0;

void RR () { //вызовы функции деления

try {

w=div (4, w);

z=div (z, x);

w=div (0.0, 0.0);

} // конец контрольного блока try

catch (overflow) {

cout<<" overFlow "<<endl;

z=1e+30; x=1.0;

}

catch(zero_divide) {

cout <<" zeroDivide "<<endl;

w=1.0;

}

catch (…) {cout << " Indeterminacy "<<endl;

}

} // конец функции RR

Int main () {

RR ();

RR ();

RR ();

return 0;

}

Результат:

zeroDivide

overflow

Indeterminacy

При первом обращении к функции RR () функция div () вызывается один раз. Сразу же возникает исключительная ситуация и посылается исключение типа zero_divide, обработчик выводит первое сообщение.

При втором вызове RR () функция div () вызывается уже два раза первый вызов проходит, а при втором возникает исключительная ситуация и посылается исключение уже типа overflow, и соответствующий обработчик выводит второе сообщение.

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