我有一個很大程度上基於QT和許多第三方庫的應用程序。這些恰巧在幾種情況下引發了一些例外。Qt/C++事件循環異常處理
在原生Qt應用程序中,這會導致應用程序中止或終止。通常主數據模型仍然保持完好,因爲我將它保存在純粹的Qt中,沒有外部數據。
所以我想我也可以通過告訴用戶在這個過程中發生了一個錯誤,他現在應該保存或者甚至決定繼續在主模型上工作來恢復。
目前該程序只是默默退出,甚至沒有講故事。
我有一個很大程度上基於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