1. 程式人生 > >《Effective Java》學習筆記 ——異常

《Effective Java》學習筆記 ——異常

  充分發揮異常的優點,可以提高程式的可讀性、可靠性和可維護性。

第57條 只針對異常的情況才使用異常

第58條 對可恢復的情況使用受檢異常,對程式設計錯誤使用執行時異常

  * 如果期望呼叫者能夠適當的恢復,使用受檢異常。

  * 大多數的執行時異常都表示前提違例(precondition violation),如ArrayIndexOutOfBoundsException。

  * 錯誤往往被JVM保留用於表示資源不足、約束失敗,或其他無法繼續執行的條件。最好不要再實現任何新的Error子類。

第59條 避免不必要的使用受檢的異常

第60條 優先使用標準的異常

  * 常用異常:IllegalArgumentException、IllegalStatusException、NullPointerException、IndexOutOfBoundsException、ConcurrentModificationException、UnsupportedOperationException等。

第61條 丟擲與異常相對於的異常

  * 更高層的實現應該捕獲底層的異常,同時丟擲可以按照高層抽象進行解釋的異常。這種做法被稱為異常轉義(exception translation),如AbstractSequentialList類的例子:

1     public E get(int index) {
2         try {
3             return listIterator(index).next();
4         } catch (NoSuchElementException exc) {
5             throw new IndexOutOfBoundsException("Index: "+index);
6 } 7 }

  * 也可以使用異常鏈(exception chaining)的形式來進行轉義,即將底層的異常作為引數傳入高層異常。

第62條 每個方法丟擲的異常都要有文件

  * 始終要單獨的宣告受檢異常,並利用Javadoc的@throws標記準確的記錄下丟擲異常的每個條件。

  * 如果一個類的許多方法出於同樣的原因而丟擲同一個異常,在該類的文件註釋中對這個異常建立文件,是可以接受的。

第63條 在細節訊息中包含能捕獲失敗的資訊

第64條 努力使失敗保持原子性

  * 一般而言,失敗的方法呼叫應該使物件保持在被呼叫之前的狀態。具有這種屬性的方法被稱為具有失敗原子性(failure atomic)。

  * 獲得失敗原子性的方法:

    (1)在執行操作之前檢查引數的有效性。

    (2)調整計算處理過程的順序,是的任何可能會失敗的計算部分都在物件狀態被修改前發生。

    (3)編寫一段恢復程式碼(不常用)。

    (4)在物件的一份臨時拷貝上執行操作,當操作完成後在用臨時拷貝中的結果代替物件的內容。

第65條 不要忽略異常

  * 至少,catch塊也應該包含一條說明,解釋為什麼可以忽略這個異常。