Java自定義異常處理——最佳實踐[譯]

咱們幾乎已經在咱們的每一個行業標準應用的代碼中處理java自定義異常了。常見的手段是建立一個語義性的繼承基礎exception類的自定義異常類。java

1)Java自定義異常處理 – 新的方法

1.1 傳統異常處理

咱們的新方法使用靜態內部類來處理每一個新的異常場景。數據庫

傳統上咱們經過繼承Exception類來建立一個DBException。而後每次遇到須要拋出一個與數據庫相關異常的時候,咱們建立一個DBException的實例,添加一些信息以後拋出它。bash

如今讓咱們考慮如下咱們須要拋出DBException的場景:單元測試

  1. SQL執行錯誤
  2. 找不到任何一行數據
  3. 當咱們只須要一行數據卻返回了多行數據
  4. 無效的參數錯誤
  5. 其它錯誤

上述方法的問題在於當這些異常在catch塊或者應用代碼中被處理時,DBException沒法提供足夠的信息來分別處理上面列出來的異經常使用例。測試

1.2 使用內部類的新異常處理

讓咱們爲每個用例建立一個內部類而後把它們組合到DBException內部來解決上述的問題吧。this

首先建立一個抽象的BaseException來做爲全部異常類的父類。spa

// BaseException.java
public abstract class BaseException extends Exception{
    private String message;
 
    public BaseException(String msg) {
        this.message = msg;
    }
    public String getMessage() {
        return message;
    }
}
複製代碼

如今建立咱們的Exception內部類。日誌

// DBExeption.java
public class DBExeption {

    public static class BadExecution extends BaseException {
        private static final long serialVersionUID = 3555714415375055302L;
        public BadExecution(String msg) {
            super(msg);
        }
    }
 
    public static class NoData extends BaseException {
        private static final long serialVersionUID = 8777415230393628334L;
        public NoData(String msg) {
            super(msg);
        }
    }
 
    public static class MoreData extends BaseException {
        private static final long serialVersionUID = -3987707665150073980L;
        public MoreData(String msg) {
            super(msg);
        }
    }
 
    public static class InvalidParam extends BaseException {
        private static final long serialVersionUID = 4235225697094262603L;
        public InvalidParam(String msg) {
            super(msg);
        }
    }
}
複製代碼

這裏咱們建立了許多內部類來處理每一種異常狀況。你能夠根據實際狀況隨意擴展新的異常內部類。code

1.3如何使用自定義異常

爲了理解它的做用,如今讓咱們來讓咱們建立一個異常而後拋出它。而後咱們將會在日誌中看見錯誤信息。繼承

// TestExceptions.java
public class TestExceptions {
    public static void main(String[] args) {
        try
        {
            throw new DBExeption.NoData("No row found for id : x");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
複製代碼

程序輸出:

Console
com.exception.DBExeption$NoData: No row found for id : x
at com.test.TestExceptions.main(TestExceptions.java:7)
複製代碼

正如你在異常棧中所見的日誌消息,它所攜帶的信息更多更具體了。它清楚展現了錯誤是什麼。在應用代碼之中,你也能夠經過檢查自定義異常實例來作對應的處理。

2. 使用內部類做爲自定義異常類的優勢

  1. 最顯著的優勢在於即便其它開發者寫了一些難以讀懂的錯誤信息,你也能夠很清楚地弄懂具體錯誤是什麼。
  2. 你可使用不一樣的異常實例來處理不一樣的異常場景
  3. 你不須要使用單個異常來覆蓋許多的異常狀況
  4. 編寫否認的單元測試用例會更加容易
  5. 日誌會更加有意義以及高可讀性
相關文章
相關標籤/搜索