自定義異常鏈處理
阿新 • • 發佈:2018-12-19
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或者父類。