簡體   English   中英

在Java中將未檢查的異常包裝為已檢查的異常

[英]Wrapping an unchecked exception into a checked exception in Java

我正在閱讀別人編寫的代碼。 未檢查的異常和檢查的異常都是自定義異常。 我看到一個未檢查的異常被拋出到一個方法內部,並且被包裹在一個catch子句中的被檢查的異常中,並再次被拋出。 通常將未檢查的異常包裝到已檢查的異常中嗎? 如果是,我們為什么要這樣做?

定制未檢查的異常是“泄漏抽象”的元凶

應用程序可能為其依賴的服務定義接口。 如果實現拋出了應用程序要特定處理的,特定於實現的未檢查異常,則它會被特定於實現的異常類型污染。 如果替換實現,這將導致維護麻煩。

為避免此問題,可以將未檢查的異常包裝在接口定義的與實現無關的已檢查異常中。

作為一個具體的例子,考慮一下Hibernate使用未經檢查的異常來通知調用者約束違例。 假設您有一個User實體,並且用戶名在數據庫中定義了唯一約束。 您想通過提示用戶輸入其他名稱來專門處理這種情況。 如果Hibernate的ConstraintViolationException沿堆棧ConstraintViolationException傳播,則應用程序將需要特定於Hibernate的處理程序。 另一方面,如果數據訪問層將其包裝在合適的自定義檢查異常中,則用新的ORM實現替換Hibernate不需要對實現層進行任何更改。

如果您在方法meth此操作,則可能是因為代碼調用
meth只需知道並檢查已檢查的異常。
假設meth可以拋出5種不同類型的未經檢查的異常,
您可以使這一點更加統一,並允許調用代碼只擔心
關於檢查的。 但是當然可以使用未經檢查的異常
也要包裝 只是編譯器將無法
在調用代碼方面有很大幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM