[英]Java: best practice for declaring unchecked exception
假設您有一些聲明拋出未經檢查的異常的方法
編輯 :讓我們說這不是你設計這個方法的人,而是一個非常可敬的框架的作者(Spring,aekhm!),你只是稱它為
void someMethod() throws UncheckedException;
我的第一個問題是:
假設您有另一種調用someMethod
方法
void someOtherMethod() {
someMethod()
}
我的第二個問題是:
someOtherMethod
聲明拋出UncheckedException
的最佳做法是什么? 只是一點背景:
Spring框架的異常基於未經檢查的異常。 因此,例如,某些方法拋出(並在throws
聲明它)DataAccessException。 如果我的代碼正在使用這些調用,它是否應該聲明拋出這些異常? 為什么?
無需在方法的throws ...
子句中聲明未經檢查的異常。 正如Java語言規范中所述 ,“ 允許但不要求在throws子句中提及未經檢查的異常類 ”。
如果您預計API的用戶可能會遇到它們,則通常會在Javadoc中列出未經檢查的異常。 一個常見的例子是列出可能拋出IllegalArgumentException
原因。
如果用另一個方法包裝一個方法,則應用有效Java原則來拋出適合抽象級別的異常(第61項)。 這應該應用於已檢查的異常和預期的未經檢查的異常。
我建議閱讀偉大的書“Effective Java”中的第9章。 您將獲得所有問題的答案,您將獲得很好的閱讀。
專門為您提問:
使用Javadoc @throws標記來記錄方法可以拋出的每個未經檢查的異常,但不要使用throws關鍵字在方法聲明中包含未經檢查的異常
最佳做法是不要聲明未經檢查的例外。 你沒有看到這樣的方法:
public void foo() throws NullPointerException {...}
您應該僅對Checked Exceptions
使用throws。 通過說throws
你希望clinet以任何方式處理他的異常,而對於Unchecked Exceptions
則不然
編輯:
在評論中有一些熱烈的討論,所以只是為了澄清:你不必聲明Unchecked Exceptions
,這並不意味着你不能,盡管在大多數情況下你不應該。 我更喜歡在javadoc樣式注釋中而不是在throws
子句中提及它們。 還有很多其他例子,你通常不應該做某些事情,但在某些情況下你可能需要這樣做。 在我看來,底線是:不,你不應該在throws clause
列出Unchecked Exceptions
。
在我看來,最好的做法是不要在方法的頭部使用throws來進行未經檢查的異常,但是不要忘記記錄你的方法拋出的每個異常(已檢查或未檢查):
/**
* Some doc
* @throws IllegalArgumentException if ...
*/
public void m() {
//...
throw new IllegalArgumentException();
}
記錄您的API是一件好事,無論是聲明拋出還是將@throws添加到您的javadoc都是一種很好的做法。 它只會讓讀者更清楚,這絕不是壞事。 我並不總是這樣做,但一般來說,你希望人們意識到某些事情可能會失敗。 我不會為NPE執行此操作,但輸入驗證錯誤或授權錯誤等內容是您可能要記錄的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.