1. 程式人生 > >自定義異常鏈處理

自定義異常鏈處理

1.自定義專案異常

使用lombok自動生成無參和全部引數的構造方法,並生成對應欄位的get和set方法

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends  Exception{
    private int code;
    private String errorMessage;
}

2.異常鏈處理

/**
 * dao層
 * /
public class MyDao {
    public void getUserInfo() throws MyException{
        throw new
MyException(2,"request param error"); } }
/**
 * service層
 * /
public class MySerivice {
    public void getUserInfo() throws Throwable{
        MyDao myDao = new MyDao();
        myDao.getUserInfo();
    }
}
public class TTService {
    public static  void main(String[] args){
        MySerivice mySerivice = new
MySerivice(); try { mySerivice.getUserInfo(); }catch (MyException myException){ System.err.println("myException:"+myException.getCode()+"/"+myException.getErrorMessage()); }catch (Exception excepiton){ System.err.println("excepiton:"+excepiton.getMessage()); }catch
(Throwable throwable){ System.err.println("throwable:"+throwable.getMessage()); } } }

執行執行之後,在TTService的MyException中捕獲到了異常,列印的異常資訊為:

myException:2/request param error

我們在MySerivice丟擲的異常變為 Throwable(aop切面丟擲的異常的就是Throwable)而不是MyException,到了TTService最終捕獲到的還是我們最初的丟擲的MyException型別。
(雖然MySerivice丟擲父類Throwable,其實父類引用指向子類物件MyException,最終捕獲的也就是子類的異常物件MyException)
異常類的繼承關係

從上圖中我們可以看出,MyException是Exception的子類,而Exception又是Throwable的子類。
我們通過throw丟擲異常MyExcepiton,方法通過throws一層層往上丟擲的異常要大於等於異常MyExcepiton,也就是說throws丟擲的異常必須是MyExcepiton或者父類。