Qt/C++事件循环异常处理
我有一个很大程度上基于QT和许多第三方库的应用程序。这些恰巧在几种情况下引发了一些例外。Qt/C++事件循环异常处理
在原生Qt应用程序中,这会导致应用程序中止或终止。通常主数据模型仍然保持完好,因为我将它保存在纯粹的Qt中,没有外部数据。
所以我想我也可以通过告诉用户在这个过程中发生了一个错误,他现在应该保存或者甚至决定继续在主模型上工作来恢复。
目前该程序只是默默退出,甚至没有讲故事。
正如在Qt文档here中所述,Qt目前并不完全是例外安全的。该页面上的“从异常中恢复”部分描述了在抛出异常时您可以在Qt应用程序中执行的唯一操作 - 清理并退出应用程序。
鉴于您使用的是第三方库,它们会引发异常,因此您需要在外部库和Qt代码之间的边界处捕获这些库,并在那里处理它们 - 如Caleb的评论中所述。如果错误必须传播到Qt应用程序中,则必须通过返回错误代码(如果可能)或发布事件来完成。
感谢您的评论,我重新实现了QApplication :: notify()并捕获了所有内容。这是非常好的,因为应用程序并不是简单地退出,而是允许用户至少保存他的数据。我已经通过从我的代码中抛出异常std :: bad_alloc等来测试了这一点。另外,我从try {} catch(...)中调用第三方lib的代码,但没有任何反应,该应用程序崩溃。 – Georg 2010-04-30 12:22:34
有时候很难捕捉到所有异常。如果偶然发生一个异常,下面的内容会有所帮助。从QApplication
继承和通过以下方式
bool MyApplication::notify(
QObject * receiver,
QEvent * event)
{
try
{
return QApplication::notify(receiver, event);
}
catch(...)
{
assert(!"Oops. Forgot to catch exception?");
// may be handle exception here ...
}
return false;
}
覆盖notify()
功能,然后通过自定义类替换您main()
功能QApplication
。所有events
和slots
通过此功能发出,以便可以捕获所有异常并且您的应用程序变得稳定。
我想我不明白你在问什么。某处你需要有处理Qt和其他库之间交互的代码。在那里做错误处理和恢复。 (是的,我知道它可能有很多很多地方。) – 2010-04-28 15:43:03
HI Caleb,感谢你的评论,我已经试过了,但其他lib只是在程序到达异常之前中止并终止程序。与此同时,我安装了一个异常处理程序,该异常处理程序在引发异常时进行恢复。不幸的是,第三方库存似乎在立即中止之前发现异常。调试器仅告诉我有关第三方代码中的访问冲突。 – Georg 2010-04-30 12:20:44
@Georg,你现在可能已经明白了。我为其他可能有相同问题的人发帖。在C++中,访问冲突和除以0不会抛出异常(至少是正常情况)。只要发生这两种错误中的一种,程序就会立即终止。 – 2015-12-18 10:59:03