16.2.8 对unexpected函数的补充
对unexpected函数来说,除了如代码16.8中Ownunexpected函数定义中采用的“exit(0)”结束整个程序外,自定义的unexpected函数还可以抛出异常,如下所示。
(1)如果新抛出的异常符合原函数的异常规范说明,与之匹配的catch块被执行,如下所示。
void fun()throw(const char*) { throw 0;//抛出了int型,这将导致unexpected函数被执行 }自定义的unexpected处理函数可抛出符合原函数规范说明的异常,如下所示。 void Myunexpected() { throw"error";//抛出字符串型异常 }
在Myunexpected函数中抛出的异常将被字符串型catch块捕获处理。
(2)如果新抛出的异常不符合原函数的异常规范说明,而且异常规范说明中没有包括std:bad_exception类型,则程序将调用terminate函数,结束程序,terminate函数定义在头文件exception中,它是从exception类派生而来。
(3)如果新抛出的异常不符合原函数的异常规范说明,而且异常规范说明中包括std:bad_exception类型,不匹配的类型将被std:bad_exception异常取代,如代码16.10所示。
代码16.10 unexpected函数抛出异常ThrowByFuncUnexpected
<———————————-文件名:example1610.cpp———————————————> 01 #include<exception> 02 #include<iostream> 03 using namespace std; 04 void Ownunexpected()//自定义Ownunexpected函数 05 { 06 cout<<"抛出了未知异常"<<endl; 07 throw"error";//或仅仅用throw也可 08 } 09 void(*old_unexpected)()=set_unexpected(Ownunexpected);//设置新的Ownunexpected函数, 10 //并返回之前unexpected函数指针 11 void fun()throw(int,bad_exception)//异常规范说明中指出:抛出的异常类型 12 //为int型,包含了bad_exception 13 { 14 throw"error";//抛出字符串类型的异常 15 } 16 int main() 17 { 18 try 19 { 20 fun(); 21 } 22 catch(const char*s)//捕获字符串型异常的catch块 23 { 24 cout<<s<<endl; 25 } 26 catch(exception&e)//使用exception类捕获派生类异常 27 { 28 cout<<e. what()<<endl; 29 } 30 return 0; 31 }
输出结果如下所示。
抛出了未知异常 St13bad_exception
注意
代码16.10 的编译和运行同样基于Eclipse环境,VC编译器未实现异常规范说明。
【代码解析】代码第11行的fun函数的异常规范说明中包含了bad_exception,因此,当Ownunexpected函数中抛出的异常仍然和原来的规范说明不匹配时,Ownunexpected函数中新抛出的异常会被自动转换成bad_exception异常,被“catch(exception&e)”捕获。