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

Mr.*_*Boy 12 c++ opengl crash exception-handling visual-c++

我的测试人员遇到问题,我的应用程序在初始化时崩溃了.我添加了更多的日志记录和异常处理,但它仍然与通用的"此程序已停止工作"消息崩溃,而不是触发我的错误处理.

鉴于我的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;
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*nks 15

如果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 
}
Run Code Online (Sandbox Code Playgroud)

  • 结构化异常处理(`__try`、`__ except` 和 `__finally`)和 C++ 异常处理(`try` 和 `catch`)不能在同一个函数中使用。请注意,处理结构化异常是正确的做法的情况非常罕见。 (2认同)

dlf*_*dlf 6

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


Rak*_*kib 6

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

  1. 超过1个未处理的异常:在处理先前发生的异常之前引发异常时,c ++无法处理它,应用程序将崩溃.
  2. 抛出不在异常规范列表中的异常:如果任何方法抛出不在异常规范列表中的异常(在任何方法中),unexpected则将调用哪些调用abort.