拥有一个C ++应用程序VS2012,它看起来像:
int main(int argc, char* argv[]){
try{
//Stuff
}
catch(exception& e){
std::cout << e.what() << std::endl;
}
int b;
cin >> b;
return 0;
}
如果我转到Debug-&gt; Exceptions,则不勾选C ++异常的复选框,并为C ++异常勾选用户处理框?所以我期待我的catch语句被执行。
我不明白为什么我的捕获声明没有被执行.....
(也不知道为什么代码在发布模式下运行,但不能在f5 + ctrl模式下运行)
答案 0 :(得分:2)
C ++异常机制不应该在程序中捕获“崩溃”。 Visual Studio编译的代码中的“崩溃”会生成所谓的结构化异常,由__try - __except - __finally
机制处理。它们完全独立于C ++异常。通常,它们不会被C ++异常处理程序捕获(即catch
)。
如果要通过C ++ try - catch
异常处理机制拦截结构化异常,则必须以/EHa
模式编译代码(这可能会产生明显的性能开销)。在IDE中,这是通过项目设置C/C++ -> Code Generation -> Enable C++ exceptions
来控制的。但是,结构化异常与std::exception
类型不兼容,因此您的catch(exception& e)
仍然不会拦截它们。您必须使用catch (...)
捕获它们,然后使用其他方法找出发生的情况。
更好的是,如果你真的必须这样做,并且你想用std::exception
来编写代码,你可以通过_set_se_translator安装翻译函数来手动将结构化异常转换为C ++异常。