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

时间:2014-05-08 13:38:22

标签: c++ visual-c++ opengl exception-handling crash

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

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

4 个答案:

答案 0 :(得分:15)

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

在Windows上有一个名为Structured Exception Handling的概念,这是操作系统引发"例外"当坏事发生时,例如解除引用无效的指针,除以零等。我说"例外"因为这些不是C ++异常;相反,这些是Windows以C风格方式定义的关键错误 - 这是因为Win32是用C语言编写的,所以C ++异常不可行。

另见:

根据评论进行更新

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

此外,是否可以展示您的应用程序?一个最小的例子?