深入討論Java中的異常處理 – JAVA編程語言程序開發技術文章

異常分為兩類:checked & unchecked exception

先看一下幾個常見的java中的unchecked excetion(RuntimeException)
ArithmeticException
ClassCastException
IndexOutOfBoundsException
IllegalArgumentException
NullPointerException
上面的幾種異常類型可以引申出RuntimeException的使用場景–
RuntimeException在正常的程序執行中是不應該出現的,無論程序的運行場景是什麼樣的~無論在什麼環境下運行~

RuntimeException可以看做是一種錯誤,理論上上層程序是可以檢測並避免的~~如果上層程序員不負責任,那麼不好意思,下層程序就用拋出RuntimeException的方式來響應你~~~

checked exception相比RuntimeException來說,更多的是給上層傳遞瞭一些信息,比如:
UserNotFoundException
PasswordErrorException
並且強制要求上層程序一定給出在遇到checked exception的時候的處理邏輯。就是說,我們認為在遇到checked exception的時候上層程序是走到瞭一個相對比較少見的情形,但是這仍然是可以接受的.可以理解為一種另類的分支語句~~~
但是如果可以使用分支語句解決的,我們還是盡量采用分支來解決而不是去使用異常,估計這一點也是C#這種語言不提供checked exception這種異常的原因之一

對於異常處理的額外幾點:

1、系統邊界處,如在WEB中與前端交互的Controller中,在為其他系統提供的接口處,都要註意捕獲所有異常,然後把異常轉換為約定格式的交互數據

2、返回給前端的信息與log信息不應該一樣,比如我們可以寫一個Controller層的AOP處理邏輯來捕獲所有的異常
1
public class BaseC extends Controller {
2
 
3
    protected static final Log log = LogFactory.getLog(BaseC.class);
4
    @Catch(Throwable.class)
5
    public static void handleThrowable(Throwable throwable) {
6
        log.error(ExceptionUtils.getStackTrace(throwable));
7
        renderJSON(new ReturnData(false, "Unknown Error~~mail to abc@onede4.com,3ks!", throwable.getMessage()));
8
    }
9
}

3、異常鏈問題:
異常在上層拋出的時候的處理原則:如果當前類處理不瞭,那就繼續往上拋,如果所有的類都處理不瞭,比如DBException,就直接給用戶一個提示就好瞭,但是在這個異常鏈處理過程中,異常不應該丟失,記log,繼續throw

4、類庫或者模塊應該定義自己的異常基類,比如jdbc那套接口,有一個公共的異常基類:SQLException,然後再根據具體的情況拋出定制化的異常,提供盡量詳細的信息,比如:
SQLTimeoutException
SQLFeatureNotSupportedException
SQLInvalidAuthorizationSpecException

5、Thinking in java的作者說:大多數時候,異常類其實隻需要一個良好定義的類名~~我們在設計異常類的命名時一定要做到準確清晰~~ 

摘自  titanrain
 

發佈留言