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

时间:2014-02-21 01:59:27

标签: c++ visual-studio exception visual-studio-2012

拥有一个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语句不会被执行。

如果我转到Debug-&gt; Exceptions,则不勾选C ++异常的复选框,并为C ++异常勾选用户处理框?所以我期待我的catch语句被执行。

我不明白为什么我的捕获声明没有被执行.....

(也不知道为什么代码在发布模式下运行,但不能在f5 + ctrl模式下运行)

1 个答案:

答案 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 ++异常。