业务错误码设计

2,295 阅读3分钟

错误码设计背景

原因:通过日志快速发现系统异常、定位异常发生地方 

设计:长度 含义(域外含义、域内含义) 

关联:错误码监控特定业务域报警 

错误码设计规范(java开发手册)

image.png

错误码规范(公司内部规范)

前提:各个域都需要遵守规范

设计:  如何设计一套规范让各个业务方接入成本更低 设计一套通用父类,三方实现父类接口 按照约定规范设计错误码即可

含义:系统异常 、业务异常

拓展:系统异常可以考虑使用aspectj切面实现 配合监控实现告警

防重:(1)统一存储层设计 (2)前置内部模块,应用定义

具体实现: 采用int定义errorCode 模块+错误码

image.png

也有部分公司采用 项目编码+模块编码+错误编号

image.png

两种方式取决于公司内部系统实现,在全链路搜索背景下,公司内部基本对自己维护应用了解,jira处理中针对项目再划分编码意义不大。

通用模型构建:

为了保证规范可持续,可构建通用错误码申请平台,提供通用SDK进行业务自定义实现,具体实现方式在Java中常用是接口。

public interface IErrors {

  Integer getCode();

  String getMessage();

  String getSolution();
}

public class Errors implements IErrors {
  private Integer code;
  private String message;
  private String solution;

   /********************************
   * 保留的基本异常 1 #
   *********************************/
      public static final Errors DEFAULT_ERROR
          = new Errors(1xxxxxxx, "{0}", "");

    /********************************
     * 业务校验异常 2 #
     *********************************/

    public static final Errors DEFAULT_BIZ_ERROR
            = new Errors(1xxxxxxx, "{0}", "");

    /********************************
     * 业务校验异常-基础消费保障相关 #
     *********************************/
   
    /********************************
     * 业务校验异常-库存  #
     *********************************/
  
}

错误日志打印:

针对异常通常采用全局切面拦截,匹配异常类型实现特定异常处理,在切面中可以定义异常打印工具类,具体实现方式为 继承RuntimeException 按 应用 -> 模块 分别实现不同的异常。

image.png

异常思考

在日常业务开发中,对于异常使用最多的还是抛出Java异常(Exception),异常又分为受检查异常(Exception)和不受检查异常(RuntimeException):

  • 受检查的异常:这种在编译时被强制检查的异常称为"受检查的异常"。即在方法的声明中声明的异常。
  • 不受检查的异常:在方法的声明中没有声明,但在方法的运行过程中发生的各种异常被称为"不被检查的异常"。这种异常是错误,会被自动捕获。
  1. 异常绑定错误码 针对运行时异常与错误码进行绑定,在全链路排查问题时可以通过异常码快速定位问题。
public class BusinessBizException extends BusinessException {

  public BusinessBizException(int code, String msg) {
    super(code, msg);
  }

  public BusinessBizException(int code, String msg, Exception e) {
    super(code, msg, e);
  }

  public BusinessBizException(int code, String msgFormat, Object... replacement) {
    super(code, msgFormat,replacement);
  }

  public BusinessBizException(Errors defaultDependencyError, String msg) {
    super(defaultDependencyError.getCode(), msg);
  }

  public BusinessBizException(String message) {
    super(message);
  }
  public BusinessBizException(Errors errors) {
    this(errors.getCode(), errors.getMessage());
  }

}
  1. 接口返回值是异常还是Result 包装类 可以参考谈谈Java接口Result设计 这篇技术博客 贴一段具体文字

image.png

总结

总结了公司内部设计错误码的实现并且粘贴部分阅读资料,以上的错误码定义基本能满足一般中大型项目。规范有了最重要的还是落地,如果有能力可以打造统一的错误码定义平台,用平台使成员遵守规范,让项目健康的迭代。