为什么我的 catch 代码没有被执行?

Why doesn't my catch code get executed?

本文关键字:执行 我的 catch 代码 为什么      更新时间:2023-10-16

有一个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;
}
  • 如果我在调试模式下运行,工作正常
  • 如果我在释放模式下运行,效果会很好
  • 如果我在F5+ctrl中运行,应用程序将崩溃,并且我的catch语句不会执行

如果我转到调试->异常,C++异常的勾选框没有勾选,而C++异常的用户处理框勾选了?所以我期待着catch语句被执行。

我不明白为什么我的catch语句没有被执行。。。。。

(也不明白为什么代码在发布模式下运行,但没有在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编写代码,你可以通过_set_se_translator安装一个翻译器函数,手动将结构化异常转换为C++异常。