2010-01-12 34 views
13

我一直在更新現有庫以引發異常,以幫助改善使用庫的人員的調試。首先,我想我會定義特定於每個類的異常,然而事實證明,這些異常大多隻是現有運行時異常的擴展(例如,FooNegativeIntArgumentException extends IllegalArgumentException,FooNullBarException extends NullPointerException),並帶有特定的消息。Java,特定於類的異常與標準異常

什麼是定義新的例外與使用現有的例外的權衡?是否有任何公約/最佳做法?另外,考慮到向後兼容的需要,這些異常中的大多數(如果不是全部)是運行時異常。

+0

感謝提供詳細信息的答案,爲什麼不一般地使用自定義異常,以及它們實際上有用的情況。 – Carl 2010-01-12 19:54:28

回答

15

這裏是my take on why we have different types of exception and when to create custom exception types(注意:它使用.NET類型作爲示例,但是相同的原則適用於Java和任何其他使用結構化錯誤處理的語言)。在這裏作爲完整的答案發布可能太長,所以我只會發布兩個關鍵提取。

  1. 當拋出不同類型的異常?針對可以以不同方式編程處理的每個症狀,拋出不同類型的異常。

  2. 何時創建自定義異常類型?當需要使用附加信息註釋異常以幫助編程處理症狀時,創建自定義異常類型。

在你的情況下,它聽起來並不像你的自定義異常類型,可以使用標準的異常來傳達症狀被填充間隙,他們不加入任何額外的信息,程序處理,所以不要創建它們。只需使用標準的。

7

擴展例外而不增加任何這樣的值是完全浪費時間並且導致最好避免的持續維護成本。

使用標準例外。

這並不是說你不應該使用自定義異常,只是不在你提供的用例中。

而且,在創建自定義異常時,它們應與引起它們的條件相關,而不是它們可能引發的類。將它們與業務/功能區域相關聯是可以的,因爲導致異常的錯誤條件可能以這種方式相關,並且它將提供有用的過濾技術。

+0

一如既往...有人毆打我的答案。 :-) – cjstehno 2010-01-12 19:45:30

+0

只要您從基本例外延伸,就不會產生客戶端成本。在許多情況下,用戶定義的異常可以比引發虛擬異常更明確的錯誤處理。 – 2010-01-12 19:47:22

+0

@Stefan - 給出的例子沒有增加任何價值。我不明白爲什麼自定義空指針或錯誤參數的例外會添加任何值,並且當然還有維護成本。每個新的參數類型或邊界現在都需要一個新的異常,而刪除這些類型會留下無用的代碼工件。 – Robin 2010-01-12 20:48:40

1

權衡?很多工作,很多代碼維護和時間就是金錢。我建議:只有當你需要過濾日誌,細粒度的異常處理或調試(爲特殊異常類型設置斷點)時,才定義新的異常。

1

我會使用明確定義的例外給客戶端代碼更多的控制。如果客戶想要,他們可以趕上IllegalArgumentException如上例所示。如果他們需要更多的控制,他們可以捕捉到各種類型的例外。例如,考慮一個可能拋出IllegalArgumentException的兩個子類的方法。如果你沒有子類,你必須做字符串解析或其他廢話來確定引發異常的實際原因。用戶定義的類型解決了這個問題。

+0

我想說這種方法的成本優勢在成本方面很重。 – Robin 2010-01-12 20:55:38

2

調用者是否可能需要捕獲FooNegativeIntArgumentException而不是IllegalArgumentException?

我的猜測是,它幾乎不會發生,所以我會堅持基本的例外,直到你有可能認爲需要區分這種情況。

6

Effective Java

您應該傾向於使用標準異常,並使用一套涵蓋你所描述的unchecked異常的Java平臺庫。重用例外具有以下優點:

讓你的API更容易學習和使用,因爲它建立了約定與程序員已經熟悉

較少的異常類意味着較小的內存佔用和花更少的時間加載類相匹配。

+0

鏈接不再有效。 http://www.oracle.com/technetwork/java/effective-exceptions-092345.html 這是它還是僅僅是關於如何購買這本書的信息的鏈接? – Raystorm 2013-04-25 18:34:18