NOTE
2.7 如何设计错误系统
1. 什么是错误 程序运行过程中发生的异常问题 2. 错误分类 按照严重程度可以分为两类:严重与普通 严重的应该终止程序。比如程序启动时初始化资源失败等情况 普通的是情况而定 3. 错误构建 创建一个错误需要带上详细信息,如下 3.1. 错误码 - 0:成功 - 1:未知异常 - 4xxxxx:客户
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么是错误
程序运行过程中发生的异常问题
2. 错误分类
按照严重程度可以分为两类:严重与普通 严重的应该终止程序。比如程序启动时初始化资源失败等情况 普通的是情况而定
3. 错误构建
创建一个错误需要带上详细信息,如下
3.1. 错误码
- 0:成功
- 1:未知异常
- 4xxxxx:客户端异常
- 5xxxxx:第三方业务系统异常
- 6xxxxx:基础中间件异常
- 7xxxxx:数据问题
3.2. 参数
3.3. 结果
参数是什么,结果是什么
3.4. 错误原因
4. 错误处理
- 继续往外抛出
- 捕获处理
- 添加额外信息
- 打印错误
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)
- 如果原先没有error需要自定义error,比如RPC逻辑错误:
- 错误处理:
- 打印错误:
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