错误码设计方案

781 阅读2分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

设计目的

所有的后端接口都无论成功失败都会有一个规范的返回值,规范化返回值不仅是为了增加代码可读性,也是为了提高问题排查效率,通过错误码快速定位问题所在。

所以,目的就是为了:

  • 统一模块管理,规范化
  • 解决多种异常处理抛出
  • 便于后期监控错误信息,快速定位错误位置

使用场景:

  • 通过错误码配置监控大盘。
  • 通过日志进行问题排查,快速定位问题。
  • 后端服务之间错误码传递。
  • 前端展示的错误提示/OpenAPI。

返回格式:

{
  code: 1111,
  message: "调用是比啊"
  data: null 
}

详细设计

错误类型,主要通过工厂模式进行设计。先实现一个错误基类,并定义基本的方法,然后其他错误类继承基类实现其他的错误类型类,重写基本的方法或者自己定义一些自己的方法。

  • 支持细粒度的错误定义
  • 通过模块划分清晰的错误类别
  • 不同系统之间的共性
public abstract class BaseError extends Error {
  public code: number;
  public data: any;
  protected constructor(code: number, message: string, data?: any) {
    super(message);
    this.code = this.getPreCode() + code;
    this.data = data;
  }
  // 抽象方法,由子类实现,获取模块异常前缀代码
  protected abstract getPreCode(): string;
  
  /**
  *  static get USER_NOT_EXIST(){
      return new BaseError(10000,"用户不存在")
  }
  */
}

错误规范

  • 错误编码( 7 位),格式:前缀码 +错误类型( 2 位)+具体业务错误码( 3 位 )
  • 范例:A10001、B10001
  • 模块编码:
    • 业务模块1错误码,前缀码:A
    • 业务模块2错误码,前缀码:B
    • 业务模块3错误码,前缀码: C
    • 业务模块3错误码,前缀码: D
    • 第三方错误码 ,模块码:E
  • 错误类型:
    • 参数错误 10
    • 业务错误 20
    • 系统错误 30
    • 数据库错误 40
    • 其他错误 50 具体错误码使用范例:
  • 缺少 id 参数 A10001
  • 缺少 name 参数 B10002