2014年3月5日 星期三

[Java] Exception 觀念筆記




圖一

Java Exception 分成兩類,
  • Checked exception : Checked exceptions for recoverable conditions. 
    • 此類型的Exception,都是繼承Exception類別
    • Java認為這類Exception,是可以修復的或處理的,故強迫開發者進行處理

  • Unchecked exceptionsRuntime (unchecked) exceptions for programming errors.
    • 此類型的Exception,均是繼承RuntimeException類別,雖然說RuntimeException本身也繼承Exception,不過在理念上,這兩種屬於不同類型。
    • Java認為這類Exception,是無法進行處理的,即所謂的Bug。(Ex: 除零)
而發生Excpetion的情況,又可分成三種,
  • Exceptions due to programming errors
    這類錯誤,屬於程式撰寫上錯誤(NullPointerException,IllegalArgumentException),並且這類型錯誤是無法修復的,故屬於Unchecked Exception。
  • Exceptions due to client code errors這類錯誤,屬於不正常API所產生的錯誤,例如試圖開啟某個File,結果發生IOException,此類型是可以修復,如嘗試開啟其他路徑的備份檔案故此類型較類似Checked Exception
  • Exceptions due to resource failures 這類錯誤,屬於資源分配錯誤,因系統資源不足而導致發生Excpetion,故也屬於Unchecked Exception。

雖然大致上如上定義,但在使用上其實會有些issue,例如當發生SQLException時,雖然知道他屬於Checked Exception,但其實這是一個無法Recovery的程式,而把定義成CheckedException是乎也不太合適,在 Best Practices for Exception Handling 提出,

When deciding on checked exceptions vs. unchecked exceptions, ask yourself, "What action can the client code take when the exception occurs?"


簡單的說,若是你覺得這個Exception無法復原,你就把他定義成 Unchecked Exception,若原本是Checked Excpetion,那就轉換成 RuntimeException(如下),來讓開發者清楚這其實是個Bug。

public void dataAccessCode(){
    try{
        ..some code that throws SQLException
    }catch(SQLException ex){
        throw new RuntimeException(ex);
    }
}

Reference
[1] Checked or unchecked exceptions (1)
[2] Best Practices for Exception Handling
[3]  Java Exception处理之最佳实践

沒有留言:

張貼留言