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

13.8 再抛出异常

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

捕获异常的处理器也可以决定不处理异常或释放资源,然后让其他处理器处理这个异常。这时,处理器只要再抛出异常,如下所示:throw;

这种不带参数的throw再抛出异常。如果开始没有抛出异常,则再抛出异常调用terminate。

常见编程错误 13.12
将空 throw 语句放在catch处理器之外,执行这种throw会调用terminate。即使处理器能处理异常,不管这个异常是否进行处理,处理器仍然可以再抛出异常以便在处理器之外继续处理。再抛出异常由外层try块检测,由所在try块之后列出的异常处理器处理。

软件工程视点 13.10
用 catch(...) 进行与异常类型无关的恢复,如释放共用资源。可以再抛出异常以警示更具体的外展catch块。

图 13.2 的程序演示了再抛出异常。在main第26行的try块中,调用函数throwwExcepion。在函数throwException的try块中,第13行的throw语句抛出标准库类exception的实例(在头文件<exception>中定义)。这个异常在第15行的catch处理器中立即捕获,打印一个错误消息,然后再抛出异常。因此终止函数throwException并将控制返回main中的try/catch块。第30行再次捕获异常并打印一个错误消息。

1 // Fig. 13.2: fig13_02.cpp
2 // Demonstration of rethrowing an exception.
3 #include <iostream>
4 #include <exception>
5
6 using namespace std;
7
8 void throwException() throw ( exception )
9{
10 // Throw an exception and immediately catch it.
11 try {
12 cout << "Function throwException\n";
13 throw exception(); // generate exception
14 }
15 catch( exception e )
16 {
17 cout << "Exception handled in function throwException\n";
18 throw; // rethrow exception for further processing
19 }
2O
21 cout << "This also should not print\n";
22 }
23
24 int main()
25 {
26 try {
27 throwException();
28 cout << "This should not print\n";
29 }
30 catch ( exception e )
31 {
32 cout << "Exception handled in main\n";
33 }
34
35 cout << "Program control continues after catch in main"
36 << endl;
37 return 0;
38 }

输出结果:

Function throwException
Exception handled in function throwException
Exception handled in main
Program control continues after catch in main

图 13.2 再抛出异常