catch(...)没有捕捉到异常,我的程序还是崩溃了。

问题描述 投票:12回答:4

我的应用程序在初始化时崩溃,我的测试器遇到了一个问题。我添加了更多的日志和异常处理,但它仍然以 "这个程序已经停止工作 "的通用消息崩溃,而不是触发我的错误处理。

鉴于我的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++ visual-c++ opengl exception-handling crash
4个回答
17
投票

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

7
投票

据我所知,至少有两种情况会导致 catch(...) 实际上不能 捕捉

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

3
投票

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.