2010-04-28 292 views
4

我有一个很大程度上基于QT和许多第三方库的应用程序。这些恰巧在几种情况下引发了一些例外。Qt/C++事件循环异常处理

在原生Qt应用程序中,这会导致应用程序中止或终止。通常主数据模型仍然保持完好,因为我将它保存在纯粹的Qt中,没有外部数据。

所以我想我也可以通过告诉用户在这个过程中发生了一个错误,他现在应该保存或者甚至决定继续在主模型上工作来恢复。

目前该程序只是默默退出,甚至没有讲故事。

+0

我想我不明白你在问什么。某处你需要有处理Qt和其他库之间交互的代码。在那里做错误处理和恢复。 (是的,我知道它可能有很多很多地方。) – 2010-04-28 15:43:03

+0

HI Caleb,感谢你的评论,我已经试过了,但其他lib只是在程序到达异常之前中止并终止程序。与此同时,我安装了一个异常处理程序,该异常处理程序在引发异常时进行恢复。不幸的是,第三方库存似乎在立即中止之前发现异常。调试器仅告诉我有关第三方代码中的访问冲突。 – Georg 2010-04-30 12:20:44

+0

@Georg,你现在可能已经明白了。我为其他可能有相同问题的人发帖。在C++中,访问冲突和除以0不会抛出异常(至少是正常情况)。只要发生这两种错误中的一种,程序就会立即终止。 – 2015-12-18 10:59:03

回答

5

正如在Qt文档here中所述,Qt目前并不完全是例外安全的。该页面上的“从异常中恢复”部分描述了在抛出异常时您可以在Qt应用程序中执行的唯一操作 - 清理并退出应用程序。

鉴于您使用的是第三方库,它们会引发异常,因此您需要在外部库和Qt代码之间的边界处捕获这些库,并在那里处理它们 - 如Caleb的评论中所述。如果错误必须传播到Qt应用程序中,则必须通过返回错误代码(如果可能)或发布事件来完成。

+0

感谢您的评论,我重新实现了QApplication :: notify()并捕获了所有内容。这是非常好的,因为应用程序并不是简单地退出,而是允许用户至少保存他的数据。我已经通过从我的代码中抛出异常std :: bad_alloc等来测试了这一点。另外,我从try {} catch(...)中调用第三方lib的代码,但没有任何反应,该应用程序崩溃。 – Georg 2010-04-30 12:22:34

5

有时候很难捕捉到所有异常。如果偶然发生一个异常,下面的内容会有所帮助。从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。所有eventsslots通过此功能发出,以便可以捕获所有异常并且您的应用程序变得稳定。