2014-05-08 77 views
6

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

鉴于我的主要()看起来像这样,并有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渲染,这是我认为事情出错的地方。

+1

我不确定我是否理解。你怎么知道这是一个未捕获的异常? – kec

+0

因为'handleApplicationError'没有被调用(它引发了一个MessageBox并杀死了我的启动画面,这些都没有发生) –

+0

但是为什么它不能仅仅是一些其他类型的程序崩溃? – kec

回答

7

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

有趣的是,谢谢你,我现在并不清楚我是如何实现这两个的 - 或者更确切地说,在我的示例代码中,我应该如何编写它以保证更安全。 lib是事情正在破坏的地方 - 这个lib确实会抛出C++异常,所以我希望他们抓住了s对我来说这些问题!是否有可能使用我的代码作为例子做什么,作为一个完美的答案? –

+0

我已经添加了一些示例代码,也许这可以用来捕获两种异常 –

+0

yuck(必须这样做,而不是您的代码!)但似乎这是解决方案 –

1

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

另外,是否可以显示更多的应用程序?一个最小的例子?

+0

这应该是一个评论... – deviantfan

+0

它肯定会崩溃,因为从该try/catch块内调用的东西 - 我得到日志记录来证明代码正在运行,然后它只是死,但没有我的错误处理被触发:( –

0

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

4

到目前为止,我知道,有可能是在那里catch(...)不能真正

比1个未处理的异常
  1. 更多的至少两种情况:时之前先前发生异常处理的异常上升,那么C++无法处理它,并且应用程序会崩溃。
  2. 投掷例外不在例外列表规范:如果任何方法抛出异常,其不处于异常规范列表(在任何)然后unexpected将被称为它调用abort
+0

+1,但在#1情况下,它不是一个简单的“崩溃”,而是一个对std :: terminate的调用 – Angew

+0

@Angew,对,默认情况下是'terminate'也会调用'abort',和#2一样 – Rakib

相关问题