【问题标题】:Why doesn't my catch code get executed?为什么我的 catch 代码没有被执行?
【发布时间】:2014-02-21 01:59:27
【问题描述】:

有一个 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->Exceptions,C++ 异常的复选框没有被勾选,而 C++ 异常的用户处理框被勾选了?所以我期待我的 catch 语句被执行。

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

(同样不明白为什么代码在release模式下运行,但不在f5+ctrl模式下运行)

【问题讨论】:

  • 嗯...//Stuff 到底发生了什么?也许您依赖于迭代器边界检查生成的异常或发布版本中不存在的异常。
  • @paddy 与哈希(unordered_map)有关。不幸的是不能说太多:s

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


【解决方案1】:

C++ 异常机制不应该在您的程序中捕获“崩溃”。 Visual Studio 编译的代码中的“崩溃”会生成所谓的结构化异常,由__try - __except - __finally 机制处理。它们完全独立于 C++ 异常。通常,它们不会被 C++ 异常处理程序(即 catch)捕获。

如果你想通过 C++ try - catch 异常处理机制拦截结构化异常,你必须在 /EHa 模式下编译你的代码(这可能会产生明显的性能开销)。在 IDE 中,这是通过项目设置 C/C++ -&gt; Code Generation -&gt; Enable C++ exceptions 控制的。但是,结构化异常与 std::exception 类型不兼容,因此您的 catch(exception&amp; e) 仍然不会拦截它们。你必须用catch (...) 抓住他们,然后用其他方法弄清楚发生了什么。

更好的是,如果您确实必须这样做并且您想根据std::exception 编写代码,您可以通过_set_se_translator 安装翻译功能,手动将结构化异常转换为C++ 异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2015-08-31
    • 2020-11-13
    相关资源
    最近更新 更多