高效Java:丟擲適合抽象的異常 - Kyle Carter
《Effective Java》一書的大部分內容都是聚焦構建一個乾淨、易懂的 API 以及它如何成為一個偉大庫的基礎。類的 API 的一部分是任何異常,它可能會丟擲已檢查(它成為簽名的一部分)或未檢查的堆疊。作為程式碼的編寫者,我們有責任確保此 API 不會出現任何意外或令人震驚的情況。發生這種情況的一種方式是暴露一個對我們正在編寫的類沒有意義的異常。
不匹配異常的一個潛在示例是,如果您請求將兩個數字相加時,方法丟擲一個IOException. 透過丟擲這個低階異常,你將實現細節暴露給呼叫者,實現細節在未來可能會改變,但現在它是你的 API 的一部分,因此很難改變。那麼有什麼方法可以解決這個問題呢?
用於解決此問題的主要方法是執行所謂的異常轉換。異常轉換是當您捕獲較低階別的異常並將其包裝在與您正在處理的抽象相匹配的較高階別的異常中時。
public E get(int index) { ListIterator<E> = listIterator(index); try { return i.next(); } catch (NoSuchElementException e) { throw new IndexOutOfBoundsException("Index: " + index); } } |
這裡將
NoSuchElementException |
上面是將較低階別的異常包裝在較高階別的異常中,但也將較低階別的異常作為原因傳遞給較高階別的異常。許多方法公開此原因欄位,並將其傳遞給 Throwable 類。
更重要的是,這個原因是透過堆疊跟蹤暴露出來的,這可以極大地幫助除錯問題。這確實間接地向呼叫方法公開了較低階別的詳細資訊。然而,它並沒有很直接地完成它,因此它不會強制呼叫者處理低階異常,相反,他們仍然可以處理高階異常,而不必擔心低階實現細節。
最容易處理的異常是不會被丟擲的異常。我們應該始終努力在我們的所有程式碼中不丟擲可避免的異常。Effective Java有時甚至建議我們可以解決異常並簡單地記錄它們並繼續前進。不過,我會警告不要使用這種模式。如果我們只是在特殊情況下丟擲異常,那麼呼叫者可能需要知道發生了一些事情,並且簡單地將其隱藏在呼叫者面前可能會出現問題。
相關文章
- oracle主動丟擲異常Oracle
- Swift 中 throws 異常丟擲Swift
- 啪,還敢丟擲異常
- Java異常十一:使用throw丟擲異常物件;throw和throws的區別Java物件
- 建構函式中丟擲的異常函式
- 擷取Spring框架自動丟擲異常Spring框架
- JAVA操作MySQL tImestamp列值為0時丟擲異常的處理~JavaMySql
- java中異常丟擲後程式碼還會繼續執行嗎Java
- C++程式丟擲異常後執行順序C++
- hibernate open session in view 丟擲異常解決方法SessionView
- 易優cms404頁面 丟擲HttpException異常HTTPException
- WCF服務端丟擲的異常會跑到客戶端服務端客戶端
- scope="session"和scope="request"--丟擲異常非常的bug+垃圾Session
- 全網最適合入門的物件導向程式設計教程:23 類和物件的Python實現-丟擲異常物件程式設計Python
- migrate:rollback 時 dropForeign 丟擲的異常解決方案
- [譯] Ruby 2.6 Kernel 的system 方法增加是否丟擲異常引數。
- 中介軟體中丟擲異常,Handler中無法捕獲
- Golang 迴圈異常丟擲不影響整個請求Golang
- java多執行緒:執行緒體往外丟擲異常的處理機制實踐Java執行緒
- Shiro身份驗證丟擲AuthenticationException異常,解決方案Exception
- 建構函式與解構函式是否可以丟擲異常函式
- jdon安裝不知丟擲空指標的異常出現在哪 求教指標
- Laravel 框架中 使用 Symfony 提供的方法 丟擲不同型別錯誤異常Laravel框架型別
- 程式碼安全測試第三十期:丟擲通用異常缺陷
- Laravel 8 表單驗證丟擲異常返回 json 格式資料LaravelJSON
- 錯誤: 代理丟擲異常錯誤: java.rmi.server.ExportException: Port already in use: 1099;JavaServerExportException
- OpenCV 3.0後的 xfeatures2d 中detect()函式丟擲異常處理OpenCV函式
- XCode除錯時丟擲異常,定位到某一行程式碼XCode除錯行程
- SpringBoot中SpringSecurity 中不能丟擲異常UserNameNotFoundException 問題解析與處理Spring BootGseException
- Laravel 打造適合 API 的異常處理響應格式LaravelAPI
- Redis client之Jedis線上程執行丟擲異常無法恢復的情形和解決方案Redisclient
- 中介軟體自定義檢測 JWT 並通過自定義異常丟擲錯誤--筆記JWT筆記
- Java foreach 中List移除元素丟擲ConcurrentMJava
- 啟動tomcat時 錯誤: 代理丟擲異常 : java.rmi.server.ExportException: Port already in use: 1099的解決辦法TomcatJavaServerExportException
- 【Java】繼承、抽象、組合Java繼承抽象
- Java 中的異常Java
- java中的異常Java
- Java異常Java