Item 58: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors

Item 58: 在可恢復(fù)的情況下使用checked exceptions,在程序錯(cuò)誤時(shí)使用runtime exceptions

Java語言提供了三種throwables:

  1. checked exceptions
  2. runtime exceptions
  3. errors

常常有人不知道什么時(shí)候用每一種。答案可能不那么清晰,但是有些通用的準(zhǔn)則可以作為強(qiáng)力參考。

使用checked 或者unchecked exception的最重要準(zhǔn)則是這個(gè):
當(dāng)你希望調(diào)用者能夠根據(jù)這個(gè)異常的指導(dǎo)來合理地恢復(fù),那就使用checked exceptions.
通過拋出checked exception,你強(qiáng)迫調(diào)用者去在catch語句中去處理異常,或者把它向外傳播。每個(gè)方法拋出的checked exceptions于是就變成了一個(gè)明確的指示:相關(guān)的情況是由于調(diào)用這個(gè)API造成的。

通過讓API調(diào)用者面對(duì)一個(gè)checked exception, API設(shè)計(jì)者因此可以委托/授信調(diào)用者去從那個(gè)狀態(tài)恢復(fù)。用戶也可以無視這個(gè)委托,只要catch住然后忽略掉就行了,但這常常是個(gè)壞主意。

有兩種unchecked throwables: runtime exceptions和errors.他們?cè)谛袨樯鲜穷愃频模憾际遣粦?yīng)該被也不需要被捕獲(caught)的異常。如果拋出了上面兩種異常,說明已經(jīng)產(chǎn)生了不太可能逆轉(zhuǎn)的錯(cuò)誤,繼續(xù)執(zhí)行下去可能會(huì)帶來更多的危害。如果程序沒有捕獲這樣的異常,那么線程就會(huì)停止,同時(shí)拋出合適的錯(cuò)誤信息。

使用runtime exeception來展示程序錯(cuò)誤(programming errors)。大部分的運(yùn)行時(shí)異常都表示存在提前違例。提前違例代表API調(diào)用者沒有遵循API使用明細(xì)。比如,使用數(shù)組的時(shí)候會(huì)有明細(xì)告訴你index應(yīng)該在0到數(shù)組長度減一之間,那么ArrayIndexOutOfBoundsException發(fā)生了就表明你沒有遵循,導(dǎo)致產(chǎn)生了提前違例(precondition violations)。

雖然JLS沒有明確要求,但是錯(cuò)誤常常被用來指示資源不足等等不能繼續(xù)執(zhí)行的條件。這些都是慣例了,所以最好不要再實(shí)現(xiàn)新的Error的子類了。所以,你實(shí)現(xiàn)的所有uncekced throwables都應(yīng)該直接或間接地繼承RuntimeException.

你也可以自定義一個(gè)不繼承自Exception/RuntimeException/Error的異常。但是,不要這么做。


后面講了好長的沒用的話,不譯了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容