我有一个问题,我的应用程序在初始化崩溃的测试。我添加了更多的日志记录和异常处理,但它仍然崩溃,并没有触发我的错误处理。
如果我的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渲染,这就是我认为事情出错的地方。
5条答案
按热度按时间4bbkushb1#
如果一个C++
catch(...)
块没有捕获错误,可能是因为Windows错误。在Windows上有一个称为Structured Exception Handling的概念,当发生不好的事情时,操作系统会引发“异常”,例如取消引用无效的指针,除以零等。我说“异常”是因为这些不是C异常;相反,这些是Windows以C风格定义的关键错误-这是因为Win32是用C编写的,所以C异常是不可行的。
参见:
EXCEPTION_POINTERS
struct的根据评论更新
如果你想要C++异常处理和SEH,也许你可以尝试以下(未经测试的)代码:
字符集
4bbkushb2#
如果一个对象的析构函数抛出了一个异常,而该对象是由于堆栈展开以处理另一个异常而被销毁的,那么程序将退出,无论是否为
catch(...)
。8i9zcol23#
到目前为止,我知道至少有两种情况
catch(...)
实际上不能 * 捕获 *1.**超过1个未处理的异常:**当一个异常在处理之前被抛出,那么c++将无法处理,应用程序将崩溃。
1.**抛出不在异常规范列表中的异常:**如果任何方法抛出不在异常规范列表中的异常(in any),则调用
unexpected
,该方法调用abort
。ssm49v7z4#
是否声明了全局对象?如果在主循环之外创建了任何对象,这可以解释为什么它没有被捕获(它不在try-catch中)。
wydwbb8l5#
如果您使用的是多线程,并且抛出了异常,提示线程的析构函数,那么可能会忽略该异常并调用abort。
std::jthread
(C20)解决了这个问题,但是如果你不能访问C20,那么你需要一个清理函数/lambda来在抛出异常之前终止线程。