当前位置: 首页 > 文档资料 > C++大学教程 >

13.11 堆栈解退

优质
小牛编辑
128浏览
2023-12-01

特定范围中拄出异常而未捕获时,函数调用堆栈解退,试图在外层 try/catch 块中捕获这个异常。函数调用堆栈解退表示未捕获异常的函数终止,删除函数的所有局部变量,控制返回函数调用点。如果函数调用点在try块中,则试捕获这个异常,如果函数调用点不在 try 块中或没有捕获这个异常,则再次发生堆栈解退。上节曾介绍过,如果程序不捕获异常,则调用函数 terminate 以终止程序。图 13.3 的程序演示了堆栈解退。

1 // Fig. 13.3: fig13_03.cpp
2 // Demonstrating stack unwinding.
3 #include <iostream>
4 #include <stdexcept>
5
6 using namespace std;
7
8 void function3() throw ( runtime_error )
9 {
10 throw runtimeerror( "runtime_error in function3" );
11 }
12
13 void function2() throw ( runtimeerror )
14 {
15 function3();
16 }
17
18 void functionl() throw ( runtime_error )
19 {
20 function2();
21 }
22
23 int main()
24 {
25 try {
26 functionl();
27 }
28 catch ( runtime_error e }
29 {
30 cout << "Exception occurred: "<< e.what() << endl;
31 }
32
33 return 0;
34 }

输出结果:

Exception occurred: runtime_error in function3

图 13.3 堆栈解退

在 main 中,第25行的 try 块调用 function1。然后第18行定义的function1调用funclion2。然后第13行定义的function2调用function3。function3的第10行抛出exception对象。由于第10行不在 try 块中,因此发生堆栈解退,function3 终止,控制返回 function2(第15行)。

由于第15行不在 try 块中,再次发生堆栈解退,function2 终止,控制返回 funetio1(第20行)。由于第20行不在try块中,又一次发生堆栈解退,fonetion1终止,控制返回main(第26行)。由于第26行在try块中,可以捕获异常,并在try块后面第一个匹配的catch处理器中处理(第28行)。