当函数抛出异常不在有效的异常列表中时,标准行为是什么?例如,当我运行此代码时:
#include <iostream>
#include <cstdlib>
using namespace std;
void NotLegal() throw(char) {
throw 42;
}
void myunexpected () {
cout << "exception not in list\n";
cin.get();
exit(0);
}
int main()
{
set_unexpected(myunexpected);
try {
NotLegal();
}
catch(...) {
cout << "exception catched";
cin.get();
}
return 0;
}
它在GCC和Visual Studio C ++编译器上的行为有所不同:
unexpected()
上调用处理函数而不是捕获异常。为什么会有这种差异?为什么MS C ++编译器不调用unexpected()
回调?
答案 0 :(得分:3)
set_unexpected
的{{3}}会调出此行为:
说明
...
C ++标准要求在函数抛出不在其throw列表中的异常时调用
unexpected
。目前的实施不支持这一点。
答案 1 :(得分:1)
你用正确的标志编译了吗? Visual Studio默认情况下不会为某些优化版本构建启用异常处理。
您需要/c and /EHsc