關于檢查與未檢查的異常的爭論可以追溯到過去。 有人說這是Java包含的最佳功能之一。 其他人則說這是他們最大的錯誤之一[ 1 ]。
辯論似乎結束了。 在這篇文章中,我將嘗試包含指向該主題的文章和書籍的鏈接。 我不是專家,但是我會盡力向您解釋為什么我得出這個結論。
辯論似乎結束了。 在這篇文章中,我將嘗試包含指向該主題的文章和書籍的鏈接。 我不是專家,但是我會盡力向您解釋為什么我得出這個結論。
所以,我們正在談論,
未經檢查的異常:
- 表示程序中的缺陷(錯誤)–通常將無效參數傳遞給非私有方法。 引用Gosling,Arnold和Holmes的《 Java編程語言》:“未經檢查的運行時異常表示的條件通常可以反映程序邏輯中的錯誤,并且無法在運行時合理地恢復。”
- 是RuntimeException的子類,通常使用IllegalArgumentException,NullPointerException或IllegalStateException實現
- 一個方法沒有義務為由其實現引發的未經檢查的異常建立策略(并且它們幾乎總是不這樣做)
檢查異常:
- 表示程序無法直接控制的區域中的無效條件(無效的用戶輸入,數據庫問題,網絡中斷,文件缺失)
- 是Exception的子類
- 一個方法必須為由其實現拋出的所有檢查的異常建立一個策略(將檢查的異常進一步傳遞到堆棧中,或以某種方式進行處理)
上面是在Java Practices Page [ 2 ]中講述的。
在我從事的許多項目中,我看到了不同的編碼方式以及各種不同的策略,代碼格式,類命名樣式,數據庫和技術。 保持不變的一件事是例外。 所有項目都有自定義異常,這些異常是通過擴展Exception類而創建的!
我敢肯定,我們大多數人都知道檢查和未檢查異常之間的區別,但是很少有人在使用它們之前會仔細考慮。 我希望所有詳細信息都在單個頁面中列出,以便說服我的團隊切換到“未經檢查的異常”。
羅伯特·C·馬丁(Robert C. Martin)在他著名的《 干凈的代碼:敏捷軟件技巧手冊》 [ 3 ]中寫下了以下幾行,以支持未檢查的異常。
辯論結束了。 多年來,Java程序員一直在爭論 檢查異常 的好處和責任 。 在 Java 的第一個版本中引入檢查異常時 ,它們似乎是一個好主意。 每個方法的簽名將列出 它可以傳遞給調用方的 所有 異常。 而且,這些異常是該類型的一部分
該方法。 如果簽名與您的 代碼 不匹配,則您的 代碼 將無法編譯 。
當時,我們認為檢查異常是個好主意; 是的,它們可以 帶來一些好處。 但是,現在很明顯,對于 強大的軟件來說 ,它們不是必需的 。 C#沒有檢查異常,盡管嘗試了各種英勇的嘗試,C ++ 也沒有。 Python或Ruby都沒有。 但是有可能用所有 這些語言 編寫健壯的軟件 。 因為是這種情況,所以我們必須(真的)決定是否應該檢查 異常。
如果您正在編寫關鍵庫,則檢查異常有時會很有用:您 必須捕獲它們。 但是在一般應用程序開發中,依賴項成本大于 收益
最后一行是最重要的,他談到了一般的應用程序開發,讓我們舉個例子,
如果必須使用DOM解析器讀取XML文件,則需要處理一些經過檢查的異常[ 5 ],例如ParserConfigurationException,SAXException和IOException。 API開發人員認為,如果XML無效,則應通知他們,以便API的使用者(即應用程序開發人員)可以決定如何處理這種情況。
現在,如果您有其他選擇來進行常規邏輯操作,則可以這樣做,否則,應該捕獲這些已檢查的異常并拋出和未檢查的異常。 這樣,方法簽名也將很干凈,我們指出如果XML無效,我們將無法做很多事情,并且我們將停止處理。 讓寫在頂層的錯誤處理程序對做什么做出適當的決定。
因此,我們需要做的就是通過擴展RuntimeException來創建自定義異常類。
在Oracle托管的Java教程中,有一個關于該辯論的有趣頁面[ 4 ],該頁面以該行結尾。 如果可以合理地期望客戶端從異常中恢復,請將其設置為已檢查的異常。 如果客戶端無法采取任何措施來從異常中恢復,請將其設置為未經檢查的異常。
我也發現很少文章支持這一點,
霍華德·劉易斯·希普的檢查異常的悲劇
杰德·衛斯理·史密斯(Jed Wesley-Smith) 是個例外
例外檢查我愛你,但你得走了 Misko Hevery
另外,很少有文章介紹一般的最佳最佳實踐,
Vineet Reynolds 處理異常的準則
異常處理反模式作者:Tim McCune
杰出實踐,作者Brian Goetz 異常處理的最佳實踐作者:Gunjan Doshi
參考: 為什么我們的JCG合作伙伴 會使用Unchecked異常而不是Java中的Checked異常 ? 面向對象的生活博客中的Manu PK。
翻譯自: https://www.javacodegeeks.com/2012/03/why-should-you-use-unchecked-exceptions.html