1. 测试代码
@Data
public class BusinessException extends RuntimeException{
private String code;
/**
* 实际抛出的业务异常
*/
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);
}
}
测试代码:
@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注解用在异常子类,导致堆栈没有打印message
“关键信息”:BusinessException(code=1001, errMsg=异常啦)
由于BusinessException
使用了@Data
注解,重写了toString()
方法,MyCodeException
异常类中继承了BusinessException
的toString()
方法。直接抛出异常时,打印异常栈的是异常类的toString()方法。
2.1 解决方案
使用@Getter注解代替@Data注解。
3. 使用log.error()打印异常。
@RequestMapping("/t1")
public void t1() {
try {
throw new MyCodeException("1001", "异常啦");
} catch (Exception e) {
log.error("", e);
}
}
控制台输出
com.tellme.execption.MyCodeException: null
“关键信息”:异常类的getMessage()字段。
由于在MyCodeException没有填充message字段,故最终输出的为空。log.error()打印异常栈是异常类的getMessage()方法。
3.1 解决方案
实现异常子类时,必须填充异常类的message字段。
网友评论