16.2.6 unexpected函数与set_unexpected函数

    当函数头中存在异常规范说明时,如果函数所抛出的异常没有列在异常规范说明中,系统将自动调用库函数unexpected,该函数默认调用terminate函数结束程序。同时,还可以调用set_unexpected库函数自定义unexpected函数,这同前面所讲的terminate函数类似,同样在使用unexpected函数和set_unexpected函数时也须包含头文件<exception>。

    如示例代码16.8所示。

    代码16.8 unexpected函数与set_unexpected函数FuncUnexpected


    <———————————-文件名:example1608.cpp———————————————> 01 #include<exception> 02 #include<iostream> 03 using namespace std; 04 void Ownunexpected()//自定义Ownunexpected函数 05 { 06 cout<<"抛出了未知异常"<<endl; 07 exit(0);//无条件退出 08 } 09 void(*old_unexpected)()=set_unexpected(Ownunexpected);//设置新的Ownunexpected函数 10 //并返回之前unexpected函数指针 11 void fun()throw(int)//异常规范说明中指出:抛出的异常类型为int 12 { 13 throw"error";//抛出字符串类型的异常 14 } 15 int main() 16 { 17 try 18 { 19 fun(); 20 } 21 catch(const char*s)//捕获字符串型异常的catch块 22 { 23 cout<<s<<endl; 24 } 25 return 0; 26 }

    输出结果如下所示。


    抛出了未知异常

    【代码解析】代码中在fun函数定义时进行了异常规范说明,fun函数抛出的异常类型为int,如果在fun函数中有其他类型的异常被抛出,默认的unexpecetd函数将被执行,当然,通过set_unexpected函数可以将库函数提供的unexpected函数进行替换,如代码第9行便使用语句“void(*old_unexpected)()=set_unexpected(Ownunexpected);”,用自定义的Ownunexpected函数替换了默认的库函数unexpected,并返回了之前的函数指针以备恢复时使用。自定义的unexpected函数格式要求和自定义的terminate函数一样,无参且返回值必须为void。

    注意

    代码16.8 中的编译应在Eclipse环境中进行,在VC6和VC 2005中都没有对异常规范说明进行支持,VC编译器接受异常规范说明(不报错)但并不实现此规范,唯一的解决办法是等待更高版本的编译器出现。