5:
|
StructA()
|
{cout
|
«
|
"Constructed a struct A" «
|
endl;
|
}
|
6:
|
~StructA()
|
{cout
|
«
|
"Destroyed a struct A" «
|
endl;
|
}
|
};
8 :
struct StructB
10: {
StructB() {cout « "Constructed a struct B" « endl; }
~StructB() {cout « "Destroyed a struct B" « endl; }
};
14:
15: void FuncB() // передача
614 ЗАНЯТИЕ 28. Обработка исключений
{
cout « "In Func В" « endl;
StructA objA;
StructB objB;
cout « "About to throw up!" « endl;
throw "Throwing for the heck of it";
}
23
void FuncAO
{
try
{
cout « "In Func A" « endl;
StructA objA;
StructB objB;
FuncB();
cout « "FuncA: returning to caller" « endl;
}
catch(const char* exp)
{
36
|
cout
|
«
|
"FuncA: Caught exception, it says: " « exp « endl;
|
37
|
cout
|
«
|
"FuncA: Handled it here, will not throw to caller"
|
|
|
«
|
endl;
|
// throw; // снимите комментирий для передачи в main ()
}
}
41
int main ()
{
cout « "main(): Started execution" « endl;
try
46
FuncA();
}
catch(const char* exp)
{
51 cout « "Exception: " « exp « endl;
}
cout « "main(): exiting gracefully" « endl;
return 0;
55
Результат
main(): Started execution
In Func A
Constructed a struct A
Constructed a struct В
In Func В
Constructed a struct A
Constructed a struct В
About to throw up!
Destroyed a struct В
Как действует обработка исключений
|
615
|
Destroyed a struct А
Destroyed a struct В
Destroyed a struct А
FuncA: Caught exception, it says: Throwing for the heck of it
FuncA: Handled it here, will not throw to caller
main(): exiting gracefully
Анализ
В листинге 28.4 функция m a in () вызывает функцию F u n cA (), которая вызывает функ
цию F u n c B (), передающую исключение в строке 21. Обе вызывающие функции, F u n c A ( ) и m a in (), являются устойчивыми к исключениям, поскольку у обеих реализован блок c a t c h ( c o n s t c h a r * ). У функции F u n c B (), передающей исключение, нет блоков
c a t c h (), а следовательно, первым обработчиком переданного ей исключения будет блок c a t c h в пределах функции F u n cA () (строки 34-39), поскольку функция F u n cA () является
вызывающей стороной для функции F u n c B ( ) . Обратите внимание: функция F u n c A ( ) ре шает, что Это исключение не имеет серьезного характера, и не передает его дальше функ ции m a in (). Следовательно, функция m a in () продолжит свою работу, как будто никакой проблемы нет. Если снять комментарий со строки 38, исключение будет передаваться вы зывающей стороне, т.е. функция m a in () также получит его.
Вывод демонстрирует также порядок создания объектов (тот же порядок, в котором они расположены в коде) и их уничтожения при передаче исключения (обратный порядку создания объектов). Это происходит не только в функции F u n c B ( ) , где было передано исключение, но также и в функции F u n c A ( ) , которая вызвала функцию F u n c B ( ) и об работала исключение.
ВНИМАНИЕ!
В листинге 28.4 показан порядок вызова деструкторов локальных объектов при
передаче исключения.
Если деструктор объекта, вызванный в связи с исключением, также передал ис
ключение, то это приведет к аварийному завершению вашего приложения.
Класс std :: exception
При обработке исключения s t d : : b a d _ a llo c в листинге 28.2 вы фактически обрабаты
вали объект класса s t d : : b a d _ a llo c , переданный оператором new. Класс s t d : : b a d _ a l-
l o c происходит от стандартного класса C++ s t d : : e x c e p t io n , объявленного в заголовке
< e x c e p tio n > .
|
Класс s t d : : e x c e p t io n является базовым для следующих классов важных исключений.
|
■
|
b a d a l l o c . Передается при неудаче резервирования памяти оператором new.
|
■
|
b a d _ c a s t . Передается оператором d y n a m ic _ c a s t при попытке приведения неправиль
|
|
ного типа (типа без отношений наследования).
|
■
|
io s _ b a s e :: f a i l u r e . Передается функциями и методами библиотеки io s t r e a m .
|
Класс s t d : : e x c e p t io n является базовым классом, предоставляющ им очень полез ный и важный виртуальный метод, w h a t ( ) , возвращающий более описательную инфор мацию о причине и природе проблемы, вызвавшей исключение. Функция e x p . w h a t ()
616 ЗАНЯТИЕ 28. Обработка исключений
в строке 18 листинга 28.2 предоставляет информацию “b a d a l l o c a t i o n ”, сообщая о том, что резервирование памяти потерпело неудачу. Вы можете использовать класс
s t d : : e x c e p tio n , являющийся базовым классом для многих типов исключений, и соз дать еще один, c a tc h ( c o n s t e x c e p t io n s ) 4, способный обрабатывать все исключения, для которых класс s t d : : e x c e p tio n является базовым:
Do'stlaringiz bilan baham: |