|
Программирование >> Аргументация конструирования
управление перелается этому блоку; если же нет, проверяется следующий блок 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 является универсальным для сообщений об ошибках. Этот класс, конечно, может быть расширен другими подклассами. Например, я могу определить класс для хранения значения некорректного аргумента в дополнение к сообщению об ошибке.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |