2010-04-28 178 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通過此功能發出,以便可以捕獲所有異常並且您的應用程序變得穩定。