|
Программирование >> Программирование на языке c++
cout str[index]; } catch(exc derived) { cout << exception handler 2\n ; } введите: -1 catch(exc base) { cout exception handler 1\n ; } введите: 1 catch(...) { cout exception handler 3\n ; } введите: 3 Обработчик исключения для базового класса должен идти после обработчика исключения производного класса. Обработчик всех исключений catch(...) должен быть последним. Если ввести, например, значение -1, то активизируется обработчик производного исключения. Если в программу ввести значение 1, то активизируется обработчик базового исключения. Если же, например, ввести значение 3, то активизируется обработчик любого исключения. 7.5. Исключения, которые не являются ошибками Механизм исключений можно рассматривать как некоторый иной способ построения управляющих конструкций в программе, например: class my class { int a,b; public: class not enough {..............}; int get int{void) { if(a<b) throw not enough(); return a; } ............... }; void f(my class& mc) { try { cout mc.getJntO endl; } catch(my class::not enough) {...........} Выше уже говорилось, что класс-индикатор исключения можно объявить как вложенным, так и внешним, например: class not enough {...............}; class my class {...............}; void f(my class& mc) { ..................... catch(not enough) {...} not enough - внешний класс Из приведенных выше примеров видно, что исключения можно рассматривать как альтернативу некоторым известным подходам. Например, для выхода из бесконечного цикла for(;;) {.....} можно использовать инструкцию break после соответствуюш;их проверок в теле этого цикла. В то же время, здесь же можно использовать и механизм исключений. Однако в целом этот механизм следует рассматривать как альтернативу только в тех случаях, когда по некоторым причинам (зависящим от конкретной задачи) традиционные управляющие структуры становятся менее эффективными. Во всех же остальных случаях исключения надо рассматривать лишь как инструмент для обработки ошибок. Рассмотрим пример, который показывает, как можно осуществить выход из бесконечного цикла for(;;). #include <iostream.h> #define ss 10 struct my struct{ int a,b; my struct{int A,int B) : a(A),b(B){} void display a less b() { if (a>=b) throw exc(); cout a++ < b endl; } struct exc { exc() {cout << all numbers have been displayed\n ;} }; void main(void) { my struct ms(5,10); try { for(;;) ms.display a less b(); } catch(my struct::exc) {}; Здесь класс (структура) ехе, обработчик исключения, используется для выхода из бесконечного цикла for(;;) и вывода сообщения: all numbers have been displayed (все числа выведены). 7.6. Спецификация функций, обрабатывающих исключения Если некоторая функция содержит инструкции throw для генерации исключений, то ее можно специфицировать (объявить) как функцию, генерирующую исключения, например: void f(void) tlirow(x,y,z); Здесь объявляется функция f, генерирующая исключения х, у, Z и исключения, которые являются производными от х, у, z (т. е. те, что наследуются из классов х, у, z). Другие исключения функция f не генерирует. В этом случае при возникновении исключения из указанного списка (т. е. х, у или z) функция f должна установить индикатор для соответствующего обработчика. Если же возникнет другое исключение, то f должна завершить свое выполнение некоторым выходом по критической (неисправляемой) ошибке (например, с помощью библиотечной функции abort). Очень важным здесь является то, что объявление функции дает пользователю информацию о том, как она взаимодействует с внешней средой. Поэтому явное объявление исключений, которые она обрабатывает, дает пользователю ясное представление о возможности использования этой функции для обработки тех или иных ошибок. Если функция объявляется без последующего списка, то она генерирует любое исключение: void f(void); генерирует любое исключение Тогда функция, которая не обрабатывает исключения, должна быть объявлена так: int f(void) tlirow(); не обрабатывает исключения Рассмотрим некоторую функцию: void f(void) tlirow(A); Предположим, что функция f генерирует исключение В, и это исключение не является производным от А. Другими словами, генерируется исключение, которого нет в списке throw.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |