Программирование >>  Аргументация конструирования 

1 ... 94 95 96 [ 97 ] 98 99 100 ... 108


управление перелается этому блоку; если же нет, проверяется следующий блок catch. Если в результате подходящий блок не найден, программа продолжает поиск уровнем выше, пока не будет обнаружен необходимый блок catch. Если искомый блок так и не найден, программа аварийно завершается. Рассмотрим приведенный ниже пример.

#include <iostream.h> #include <stdio.h>

class Obj

dublic:

Cbj (char c}

label = c;

cout Конструируем объект label endl;

-Obj 0

cout Ликвидируем объект label endl;

protected:

J. char label;

void ()

void f 2 ( ) ;

int main(int, char*[j)

try {

Obi b( b) ; fl 0 ;

catch(float f)

cout << Исключение float endl;

cout << Исключение int << endl;

catch (...) {

cout << Исключение... << endl;

return 0;

Obj c(c); f2() ;

caech(char* pMsg)



cout << Исключение char* << endl ;

void f2 0

Obj d(d); throw 10;

В результате работы этой программы на экран будет выведен следующий текст:

Конструируем объект а Конструируем объект Ь

Конструируем объект с Конструируем объект d

Ликвидируем объект d Ликвидируем объект с Ликвидируем объект b Исключение int Ликвидируем объект а

Как видите, прежде чем в функции f 2 () происходит исключение int, конструируются четыре объекта - а, ь, с и d. Поскольку в f2 () блок try не определен, С+ + разворачивает стек вызовов функций, что приводит к ликвидации объекта d при разворачивании стека f2 (). В функции fl() определен блок try, но его блок catch

воспринимает только char*, что не совпадает с брошенным объектом int. Поэтому

С++ продолжает просмотр, что приводит к разворачиванию стека функции f 1() (при этом ликвидируется объект с).

В функции main{) С++ находит еще один блок try. Выход из этого блока приводит к выходу из области видимости объекта Ь. Первый за блоком try блок catcii принимает float, что вновь не совпадает с нашим int, поэтому пропускается и этот

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

Жа же мы tfqeut ifioccunb?

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

самом деле ключевое слово throw работает с любым типом объекта. Это значит, что вы можете бросать любое количество информации. Рассмотрим приведенное ниже

определение класса.

iinclude <iostream.h> include <string.h>

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

class Exception

public:

Exception (char* pMsg, char le, int nLine)

strncpy(msg, pMsg, sizeof msg) ; msg[sizeof msg - 1] = \0 ; strncpy (file, pFile, sizeof file);



filelsizeof file - 1] = \0; lineNum = nLine;

virtual void display (ostreams. out) {

out << Ошибка < < msg << >\n ; out обнаружена в строке # lineNum , файла file endl;

protected:

сообщение об ошибке char msg[80];

имя файла и строка, в которой возникла ошибка char f i 1 е [ 8 О ] ; int lineNum;

Генерация исключения при этом будет выглядеть следующим образом:

thro Отрицательный аргумент факториала , LINE , EILE ) ;

Являясь встроенными макроопределениями, FILE и LINE представляют собой имя исходного файла и текущую строку в


Класс ostream, использованный в функции display (), является базовым для потоков вывода (см. главу 26, Использование потоков ввода-

вывода ).

Соответствующий блок catch выглядит довольно просто: void myFunc() try

...любой вызов

захват объекта Exception

catch(Exceptions х)

исполвзуем встроенную функцию-член X.display(cerr);

Блок catch перехватывает исключение Exception, а затем использует встроенную функцию-член display О для отображения сообщения об ошибке.

г-Ь; Объект гг представляет собой поток вывода для сообщений об ошибках, т.е. почти то же, что и cout. Разница между cout и cerr существенна только для профессиональных программистов.

Класс Exception является универсальным для сообщений об ошибках. Этот класс, конечно, может быть расширен другими подклассами. Например, я могу определить класс для хранения значения некорректного аргумента

в дополнение к сообщению об ошибке.




1 ... 94 95 96 [ 97 ] 98 99 100 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика