有一个 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模式下运行,工作正常。
- 如果我在 Release模式下运行,工作正常。
- 如果我在 F5+ ctrl 中运行,应用程序崩溃并且我的 catch 语句没有被执行。
如果我转到“调试”->“异常”,C++ 异常的复选框未被选中,而用户处理的 C++ 异常复选框被选中?所以我期待我的 catch 语句被执行。
我不明白为什么我的 catch 语句没有被执行.....
(也不明白为什么代码在release模式下运行,但在f5+ctrl模式下不运行)
最佳答案
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
编写你的代码,你可以通过安装翻译器函数手动将结构化异常转换为 C++ 异常_set_se_translator .
关于c++ - 为什么我的捕获代码没有被执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21923744/