1. 測(cè)試代碼
@Data
public class BusinessException extends RuntimeException{
private String code;
/**
* 實(shí)際拋出的業(yè)務(wù)異常
*/
private String errMsg;
public BusinessException(String code, String errMsg){
this.errMsg = errMsg;
this.code=code;
}
public BusinessException(String code, String errMsg, String message){
super(message);
this.errMsg = errMsg;
this.code = code;
}
}
public class MyCodeException extends BusinessException {
public MyCodeException(String code, String msg) {
super(code, msg);
}
}
測(cè)試代碼:
@RequestMapping("/t2")
public void t2() {
throw new MyCodeException("1001", "異常啦");
}
@RequestMapping("/t1")
public void t1() {
try {
throw new MyCodeException("1001", "異常啦");
} catch (Exception e) {
log.error("", e);
}
}
2. 直接拋出異常:
@RequestMapping("/t2")
public void t2() {
throw new MyCodeException("1001", "異常啦");
}
異常信息:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is BusinessException(code=1001, errMsg=異常啦)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
lombok的@Data注解用在異常子類唐断,導(dǎo)致堆棧沒有打印message
“關(guān)鍵信息”:BusinessException(code=1001, errMsg=異常啦)
由于BusinessException
使用了@Data
注解,重寫了toString()
方法叛薯,MyCodeException
異常類中繼承了BusinessException
的toString()
方法羊始。直接拋出異常時(shí)依啰,打印異常棧的是異常類的toString()方法。
2.1 解決方案
使用@Getter注解代替@Data注解店枣。
3. 使用log.error()打印異常速警。
@RequestMapping("/t1")
public void t1() {
try {
throw new MyCodeException("1001", "異常啦");
} catch (Exception e) {
log.error("", e);
}
}
控制臺(tái)輸出
com.tellme.execption.MyCodeException: null
“關(guān)鍵信息”:異常類的getMessage()字段。
由于在MyCodeException沒有填充message字段鸯两,故最終輸出的為空闷旧。log.error()打印異常棧是異常類的getMessage()方法。
3.1 解決方案
實(shí)現(xiàn)異常子類時(shí)钧唐,必須填充異常類的message字段忙灼。