公司封装的自定义异常类有问题!!

一、线上日志

请问这个错误消息你能看出什么?

公司封装的自定义异常类有问题!!_第1张图片

 

二、代码分析

这段日志的代码背景:

        try {
    
            if (...) {
                throw new CustomException(CodeEnum.MSG_ILLEGAL.getErrorCode(),CodeEnum.MSG_ILLEGAL.getErrorMsg());
                              
              }
            

        } catch (Exception e) {
                log.error("接受单条信息错误记录====", e);
        }

从上面日志可以看到,一定时走了 if 语句,但是错误信息却是 null !有点让人摸不着头脑,无从排查。

关键代码在日志打印这一句,调试后发现:log 通过占位符打印 e 最终会调用 e.getMessage 而不是 toString 方法!!

再来看封装的异常类代码:

@Data
@EqualsAndHashCode(callSuper = false)
public class CustomException extends RuntimeException{
    /**
     * 错误码
     */
    protected Integer errCode;

    /**
     * 错误信息
     */
    protected String errMsg;

    /**
     * 无参构造函数
     */
    public CustomException() {
        super();
    }

    public CustomException(ResponseCode responseCode) {
        this.errCode = responseCode.getCode ();
        this.errMsg = responseCode.getMsg ();
    }

    public CustomException(Throwable e) {
        super(e);
    }

    public CustomException(Integer errorCode) {
        this.errCode = errorCode;
    }

    public CustomException(Integer errorCode, String errMsg) {

        this.errCode = errorCode;
        this.errMsg = errMsg;
    }

}

通过 @Data 生成的有用的额 toString 方法并不会别调用,而是调用了父类 Throwable 的 getMessage 方法:

    public String getMessage() {
        return detailMessage;
    }

三、修复

通过上面的分析得知,修复方法很多:

比如在有参构造方法调用父类构造方法:

    public CustomException(Integer errorCode, String errMsg) {
        super(errMsg);
        this.errCode = errorCode;
        this.errMsg = errMsg;
    }

或者重写 getMessage 方法:

    @Override
    public String getMessage() {
        return errMsg;
    }

四、总结

很多东西在使用的时候想当然了:

        System.out.println(e);// e.toString
        log.info("",e); // e.getMessage
        log.info("" + e); // e.toString

封装工具类后一定要充分验证并形成文档,否则后面会越用越乱,问题也越来越多!!


如果觉得还不错的话,关注、分享、在看, 原创不易,且看且珍惜~

 

你可能感兴趣的:(服务器架构,内功,Java,java,开发语言)