0

我想知道如何知道如何創建並拋出一個已檢查的異常或未經檢查的異常。如何決定創建一個已檢查的異常或未經檢查的異常

例如,我有一個服務,它使用它之前需要一些數據並驗證它。在驗證過程中,某個字段不符合規則,我想拋出異常說ValidationException()。我如何知道決定應該檢查還是不檢查。

在另一種情況下,我從我的代碼調用外部Web服務,例如谷歌股票API。假設我有3秒的超時時間。如果時間exprires我想拋出異常說BackendException()。我怎麼知道它應該是一個檢查異常還是一個未檢查的異常。

在此先感謝。

+0

最好從未經過檢查的例外開始。然後,如果您發現很多編程錯誤是由於未處理異常而產生的,現在可以考慮將特定的異常轉換爲已檢查的異常。 –

+0

一般的經驗法則是:如果一個異常只是一個「失敗」,沒有特殊的處理,除了記錄它並使請求失敗,它應該被取消選中。 –

+0

另請參見:[何時選擇checked和unchecked exceptions](http://stackoverflow.com/questions/27578/when-to-choose-checked-and-unchecked-exceptions?rq=1) –

回答

3

可能有不同的意見,但我想說的區別是調用者應該如何處理該異常:

  • 如果你想無論是做一些事情,以確保來電處理異常(日誌記錄,試圖恢復等)或重新拋出,然後使用檢查的異常。一個例子是ValidationException:如果數據無效,則調用者必須處理該數據,例如,通過告訴某人修復數據或嘗試其他方法。
  • 它你不想強迫調用者處理異常,通常不應該被拋出(例如編程錯誤等)使用未經檢查的異常。一個例子可能是總是令人害怕的NullPointerException不應該發生,你想使用的東西是空的,所以它可能被認爲是一個編程錯誤。如果某些東西可能爲空,但不應該使用檢查的異常。

    請注意,某些庫/方法使用IllegalArgumentException這是一個未檢查的異常。如果拋出這個異常,通常會有一個編程錯誤,因爲方法的約定(例如參數值不能是負數)被違反,調用者應該修復代碼或自己做一些檢查。

另一種觀點可能是:在某些情況下預計會拋出異常嗎?預期的異常(這仍然意味着某種錯誤發生)將被檢查異常,因爲這樣你會與調用者通信,他應該期望在某些情況下拋出異常(例如,如果數據無效)。如果異常是意外的,你不應該強制調用者處理這樣的異常,因爲你不希望它被拋出 - 因此它將是一個未經檢查的異常。

1

根據Joshua Bloch,Book Effective Java,Item 58將其彙總爲一行。 Thumb規則是對可恢復條件使用checked checked異常,對編程錯誤使用運行時異常。

+0

請注意,只記錄異常或打印其堆棧跟蹤不是從中「恢復」。 – VGR