我遇到了测试人员的问题,我的应用程序在初始化时崩溃了。我添加了更多的日志记录和异常处理,但它仍然与通用的“此程序已停止工作”消息崩溃,而不是触发我的错误处理。
鉴于我的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渲染的库,这是我认为出错的地方。
答案 0 :(得分:15)
如果C ++ catch(...)
块没有捕获错误,可能是因为Windows错误。
在Windows上有一个名为Structured Exception Handling的概念,这是操作系统引发"例外"当坏事发生时,例如解除引用无效的指针,除以零等。我说"例外"因为这些不是C ++异常;相反,这些是Windows以C风格方式定义的关键错误 - 这是因为Win32是用C语言编写的,所以C ++异常不可行。
另见:
EXCEPTION_POINTERS
struct 根据评论进行更新
如果你想要C ++异常处理和SEH,也许你可以尝试以下(未经测试的)代码:
__try
{
try
{
// Your code here...
}
catch (std::exception& e)
{
// C++ exception handling
}
}
__except(HandleStructuredException())
{
// SEH handling
}
答案 1 :(得分:6)
到目前为止,我知道,至少有两种情况catch(...)
无法实际捕获
unexpected
。答案 2 :(得分:2)
如果由于堆栈展开而被销毁的对象的析构函数抛出异常以处理不同的异常,程序将退出,catch(...)
或不。{/ p>
答案 3 :(得分:1)
您是否声明了任何全局对象? 如果你在主循环之外创建了任何对象,这可以解释为什么它没有被捕获(它不在你的try-catch中)。
此外,是否可以展示您的应用程序?一个最小的例子?