簡體   English   中英

Java:聲明未經檢查的異常的最佳實踐

[英]Java: best practice for declaring unchecked exception

假設您有一些聲明拋出未經檢查的異常的方法

編輯 :讓我們說這不是你設計這個方法的人,而是一個非常可敬的框架的作者(Spring,aekhm!),你只是稱它為

void someMethod() throws UncheckedException;

我的第一個問題是:

  1. 除了在throws子句中聲明未經檢查的異常之外,還有其他原因嗎?

假設您有另一種調用someMethod方法

void someOtherMethod() {
    someMethod()
}

我的第二個問題是:

  1. 決定是否在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.

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