繁体   English   中英

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

[英]catch(…) is not catching an exception, my program is still crashing

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

鉴于我的 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 渲染的库,我认为这是出错的地方。

如果 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 
}

到目前为止,我知道,至少有两种情况catch(...)实际上无法捕获

  1. 超过 1 个未处理的异常:在处理先前发生的异常之前引发异常时,c++ 无法处理它,应用程序将崩溃。
  2. 引发异常,是不是在异常规范列表:如果任何方法抛出一个异常,这是不是在异常规范列表(任何)则unexpected将被称为这就要求abort

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

您是否声明了任何全局对象? 如果您在主循环之外创建了任何对象,这可以解释为什么它没有被捕获(它不在您的 try-catch 中)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM