NOTE

2.7 如何设计错误系统

1. 什么是错误 程序运行过程中发生的异常问题 2. 错误分类 按照严重程度可以分为两类:严重与普通 严重的应该终止程序。比如程序启动时初始化资源失败等情况 普通的是情况而定 3. 错误构建 创建一个错误需要带上详细信息,如下 3.1. 错误码 - 0:成功 - 1:未知异常 - 4xxxxx:客户

系统设计创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么是错误

程序运行过程中发生的异常问题

2. 错误分类

按照严重程度可以分为两类:严重与普通 严重的应该终止程序。比如程序启动时初始化资源失败等情况 普通的是情况而定

3. 错误构建

创建一个错误需要带上详细信息,如下

3.1. 错误码

  • 0:成功
  • 1:未知异常
  • 4xxxxx:客户端异常
  • 5xxxxx:第三方业务系统异常
  • 6xxxxx:基础中间件异常
  • 7xxxxx:数据问题

3.2. 参数

3.3. 结果

参数是什么,结果是什么

3.4. 错误原因

4. 错误处理

  1. 继续往外抛出
  2. 捕获处理
    1. 添加额外信息
    2. 打印错误

5. 错误与调用方

错误信息有些不能暴露给调用方,需要屏蔽掉

6. 实例

  • 错误构建:NewWithCodef(code int, format string, args ...interface{}) error
    • 如果原先没有error需要自定义error,比如RPC逻辑错误:errors.NewWithCodef(int(pb.ErrorCode_ERRCODE_RPC_CODE_NOT_ZERO), call home_page_rank GetRank logic error. req: %v, ret: %v", req, ret)
    • 如果原先已有error且需要复用errCode,比如框架层抛出MySQL错误:errors.NewWithCodef(errs.Code(err), QueryGameItemsMall erro. req: %v, err: %v", req, err)
  • 错误处理:
    • 打印错误:log.ErrorContextf(ctx,"%v",err)
    • 错误码转code、msg:WrapWithCode(err error, code int, msg string) error,比如errors.WrapWithCode(err, int(pb.ErrCode_ERR_CODE_FAIL), constant.GetErrCodeDesc(pb.ErrCode_ERR_CODE_FAIL))

7. 参考

关于错误码的那点事 - 知乎 在API程序设计开发中错误码如何规划设计? - 知乎 Go错误处理最佳实践 - Mohuishou