16.2.5 terminate函数和set_terminate函数
如果try块抛出的异常没有任何一个catch块能与之匹配,一个特殊的库函数terminate(在头文件<exception>中定义)会被自动调用。默认情况下,terminate函数会调用标准C库函数abort使程序执行异常而退出。
通过使用<exception>头文件中提供的set_terminate函数,可以自定义terminate函数,set_terminate函数返回被替换的指向terminate函数的指针(第一次调用set_terminate函数时,返回函数库中默认的terminate函数的指针),这样就可以在需要的时候恢复以前的terminate函数。自定义的terminate函数不能有参数,返回值必须是void,而且,必须无条件服从某个结束语句,如调用exit函数或abort函数结束整个程序。换言之,如果terminate函数被调用,意味着问题已无法解决,情况已不可收拾,必须结束程序。
如示例代码16.7所示。
代码16.7 terminate函数和set_terminate函数的用法FuncTerminate
<——————————-文件名:example1607.cpp————————————————> 01 #include<exception>//必须的头文件 02 #include<iostream> 03 using namespace std; 04 void Ownterminate()//自定义Ownterminate函数 05 { 06 cout<<"严重错误,退出"<<endl; 07 exit(0);//无条件退出 08 } 09 void(*old_terminate)()=set_terminate(Ownterminate);//设置新的Ownteminate函数 10 //返回之前teminate函数指针 11 void fun() 12 { 13 throw"error";//抛出字符串类型的异常 14 } 15 int main() 16 { 17 try 18 { 19 fun(); 20 } 21 catch(int x)//只定义了捕获int型异常的函数 22 { 23 cout<<x<<endl; 24 } 25 return 0; 26 }
输出结果如下所示。
严重错误,退出
【代码解析】代码第4行,自定义了Ownterminate函数,代码第9行使用语句“void(*old_terminate)()=set_terminate(Ownterminate);”使用Ownterminate函数代替了之前的terminate函数,使用函数指针old_terminate存储了之前的terminate函数,以备恢复时使用。这样,当try块抛出的异常类型找不到与之匹配的catch块时,Ownterminate函数将被触发,输出告警信息“严重错误,退出”,如前所述如果teminate函数(无论是库函数,还是自定义函数)被触发,意味着程序已无法挽救,必须无条件退出,代码16.7中调用了函数“exit(0)”结束程序。