4

我有一个严重基于 QT 和许多第三方库的应用程序。这些碰巧在几种情况下引发了一些异常。

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

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

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

4

2 回答 2

6

有时很难捕获所有异常。如果一个异常意外漏掉,下面的帮助会很大。通过以下方式继承QApplication并覆盖函数notify()

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;
}

然后用您的自定义类替换QApplication函数main()中的。所有的eventsslots都是通过这个函数发出的,这样就可以捕获所有的异常,让你的应用程序变得稳定。

于 2012-05-25T15:01:01.223 回答
5

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

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

于 2010-04-29T07:54:35.057 回答