美文网首页
log.error()输出的异常栈没有“关键”信息解决方案

log.error()输出的异常栈没有“关键”信息解决方案

作者: 小胖学编程 | 来源:发表于2021-06-10 09:58 被阅读0次

    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异常类中继承了BusinessExceptiontoString()方法。直接抛出异常时,打印异常栈的是异常类的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字段。

    相关文章

      网友评论

          本文标题:log.error()输出的异常栈没有“关键”信息解决方案

          本文链接:https://www.haomeiwen.com/subject/lidosltx.html