Effective Java 第三版——77. 不要忽略異常

Tips
書中的源代碼地址:https://github.com/jbloch/effective-java-3e-source-code
注意,書中的有些代碼裏方法是基於Java 9 API中的,因此JDK 最好下載 JDK 9以上的版本。java

Effective Java, Third Edition

77. 不要忽略異常

雖然這一建議彷佛顯而易見,但它常常被違反,所以值得重複說起。當API的設計人員聲明一個拋出異常的方法時,他們試圖告訴你一些事情。不要忽忽略它!在方法調用的周圍加上一條try語句,其catch塊爲空,這樣就很容易忽略了異常:git

// Empty catch block ignores exception - Highly suspect!
try {
    ...
} catch (SomeException e) {
}

空的catch塊違背了異常的初衷,而異常的目的是強迫處理異常狀況。忽略異常相似於忽略火災警報——關掉它,這樣其餘人就沒有機會看到是否真的發生了火災。你可能僥倖逃脫,或者結果多是災難性的。每當你看到一個空的catch塊,你的腦海中就應該響起警報。github

但在某些狀況下,忽略異常是合適的。例如,在關閉FileInputStream時,它多是合適的。你沒有更改文件的狀態,所以不須要執行任何恢復操做,而且已經從文件中讀取了所需的信息,所以沒有理由停止正在進行的操做。記錄異常多是明智的,這樣若是這些異常常常發生,你就能夠調查這個問題。若是選擇忽略異常,catch塊應該包含一條解釋爲何這樣作是合適的註釋,而且變量應該被命名爲ignore:編程

Future<Integer> f = exec.submit(planarMap::chromaticNumber);
int numColors = 4; // Default; guaranteed sufficient for any map
try {
    numColors = f.get(1L, TimeUnit.SECONDS);
} catch (TimeoutException | ExecutionException ignored) {
    // Use default: minimal coloring is desirable, not required
}

本條目中的建議一樣適用於檢查異常和未檢查異常。無論異常是表示可預測的異常狀況仍是編程錯誤,用空catch塊忽略它將致使程序在錯誤面前默默地執行下去。而後,程序可能會在將來的任意時間失敗,在代碼中與問題根源沒有明顯關係的某個點上。正確處理異常能夠徹底避免失敗。僅僅讓異常向外傳播至少會致使程序迅速失敗,保留信息以幫助調試失敗的緣由。ui

相關文章
相關標籤/搜索