catch(...) 没有捕获异常,我的程序仍然崩溃

新手上路,请多包涵

我的测试仪有问题,我的应用程序在初始化时崩溃了。我添加了更多的日志记录和异常处理,但它仍然会因通用的“此程序已停止工作”消息而崩溃,而不是触发我的错误处理。

鉴于我的 main() 看起来像这样并且有 catch(...) 在什么情况下不会触发?

 try{
    simed::CArmApp app(0, cmd);
    for(bool done = false;!done;)
    {
        done = !app.frame();
    }
} catch(const std::runtime_error &e){
    handleApplicationError(e.what());
    return -1;
} catch(...) {
    handleApplicationError("Unknown Error");
    return -999;
}

我的代码正在调用一个执行 OpenGL 渲染的库,我认为这是出了问题的地方。

原文由 Mr. Boy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

如果 C++ catch(...) 块没有捕获错误,可能是因为 Windows 错误。

在 Windows 上,有一个称为 结构化异常处理 的概念,当坏事发生时操作系统会引发“异常”,例如取消引用无效的指针、除以零等。我说“异常”是因为这些不是 C++ 异常;相反,这些是 Windows 以 C 风格定义的严重错误 - 这是因为 Win32 是用 C 编写的,因此 C++ 异常不可行。

也可以看看:

根据评论更新

如果您想要 C++ 异常处理和 SEH,也许您可以尝试以下(未经测试的)代码:

 __try
{
    try
    {
        // Your code here...
    }
    catch (std::exception& e)
    {
        // C++ exception handling
    }
}
__except(HandleStructuredException())
{
    // SEH handling
}

原文由 Peter Monks 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果由于堆栈展开以处理不同的异常而被销毁的对象的析构函数抛出异常,则程序将退出, catch(...) 或不退出。

原文由 dlf 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏