【请教高手】为什么set_unexpected和自己的unexpected没有起作用
源程序:
//Unexpected.cpp
//"Doesn't terminate properly"
#include <exception>
#include <iostream>
using namespace std;
class Up{};
class Fit{};
void g();
void f(int i) throw(Up, Fit){
switch(i){
case 1: throw Up();
case 2: throw Fit();
}
g();
}
void g(){throw 47;}
void my_unexpected(){
cout<<"unexpected exception throw"<<endl;
exit(0);
}
int main(int argc, char* argv[])
{
set_unexpected(my_unexpected);
for(int i=1; i<=3; i++)
try{
f(i);
}catch(Up){
cout<<"Up caught"<<endl;
}catch(Fit){
cout<<"Fit caught"<<endl;
}
return 0;
}
注释:
书上说,如果函数所抛出的异常没有列在异常规格说明的异常集中,unexpected()会被调用。默认的unexpected函数会调用terminate函数。
另外,可以调用函数set_unexpected()来设置自己的函数来响应意外的异常。如本例题。
问题:
i为1时,抛出Up异常,包含在异常规格说明中,被捕获,输出Up caught,可以理解。
i为2时,抛出Fit异常,包含在异常规格说明中,被捕获,书出Fit caught,可以理解。
不能理解的是,i为3时,调用g(),抛出47。不包含在异常规格说明中,此时set_unexpected和自己的my_unexpected不是该起作用吗?
为什么单步执行时发现“throw 47”这个地方就出错了。提示:
“Unhandled exception in Unexpected.exe”。
直接运行,说“Debug error”。
源程序的注释中“//"Doesn't terminate properly"”是否就是表明了这个意思呢,既然这样,我又怎样才能看到效果,验证set_unexpected起作用了呢。