一千萬個為什麽

搜索

在哪裏處理致命的例外

我正在考慮一個設計,在Swing應用程序中使用自定義UncaughtExceptionHandler處理所有致命異常。這將包括意外的RuntimeExceptions,但也包括在關鍵資源不可用或以其他方式失敗時引發的自定義異常(例如,找不到設置文件或服務器通信錯誤)。 UncaughtExceptionHandler將根據特定的自定義異常執行不同的操作(對於所有未預料到的異常都會執行一件事),但在所有情況下,應用程序都會向用戶顯示錯誤消息並退出。替代方法是為所有未預料到的異常保留UncaughtExceptionHandler,但處理接近其原點的所有其他致命場景。

我正在考慮設計的聲音,還是我應該使用替代品?用於處理致命異常的典型方法是什麽?

最佳答案

通常,很難找到一個好的異常處理策略。每種方法都有其缺點。特別是,你的在某種意義上是好的(處理失敗的集中位置)但是受到這個缺陷的影響:

您描述的異常處理程序將對每個可能的異常進行特殊處理。隨著時間的推移,它將成為您的應用程序的焦點:每次添加新功能時,您還需要向處理程序添加異常處理邏輯。這意味著:

  1. 處理程序是其他部分的高度依賴,impl的變化。某些功能可能會觸發處理程序中的相應更改。您需要小心保持這兩者同步。
  2. 處理程序具有較差的一致性(有很多原因需要更改) - 它包含應用程序所有功能的交集。

另一個問題是錯誤恢復。拋出異常(並向用戶顯示一些通知)後,用戶希望繼續使用該應用程序。這意味著如果您的代碼開始修改內部數據結構然後因異常而停止,則在允許用戶進行其他交互之前,您需要撤消這些修改(或者至少使數據結構恢復到可行狀態)。要實現這一目標,需要重新思考數據的組織方式。一種可能的解決方案是DB事務。另一方面,這種表示比普通的數據結構更復雜,因此您需要根據應用程序的需求進行權衡(它是玩具/原型嗎?)

轉載註明原文: 在哪裏處理致命的例外