c++ - 为什么我的捕获代码没有被执行?

标签 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;
}
  • 如果我在 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/

相关文章:

c++ - 无法在动态链接库中找到过程入口点 clCreateCommandQueueWithProperties

java - 异常处理 - 给定场景中的可能方法

c++ - Firebird 数据库文件拷贝打不开

实例化自定义对象的 Javascript///<field type=?>

c++ - 为什么使用reinterpret_cast 将char* 转换为结构似乎可以正常工作?

c++ - 我可以直接与 Windows 上的音频端点交互吗?

.net - JScript.NET 能否区分不同的.NET 异常类型

python - 如何通过引发异常来 pytest 一个 python 函数

c++ - 我可以将反向迭代器转换为正向迭代器吗?

c++ - 如何从我正在阅读的文件中删除所有标点符号?