NOTE
3.17 如何设计错误系统
错误系统设计的历史学习笔记,覆盖错误分类、错误码、上下文、传播、日志记录与对外错误信息处理。
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么是错误
程序运行过程中发生的异常问题
2. 错误分类
按照严重程度可以分为两类:严重与普通 严重的应该终止程序。比如程序启动时初始化资源失败等情况 普通的是情况而定
3. 错误构建
创建一个错误需要带上详细信息,如下
3.1. 错误码
错误码可以按错误来源或处理方式划分,例如:
- 成功
- 未知异常
- 客户端或参数异常
- 上游依赖异常
- 基础设施或中间件异常
- 数据异常
具体数值区间由系统自行约定。
3.2. 参数
3.3. 结果
参数是什么,结果是什么
3.4. 错误原因
4. 错误处理
- 继续往外抛出
- 捕获处理
- 添加额外信息
- 打印错误
5. 错误与调用方
错误信息有些不能暴露给调用方,需要屏蔽掉
6. 实例
下面使用与具体语言、框架和业务无关的伪代码表示核心思路:
function build_error(code, message, context, cause = null):
error = Error(code, message)
error.context = context
error.cause = cause
return error
function handle_error(context, error):
log_error(context, error)
public_error = sanitize_error(error)
return public_error.code, public_error.message
- 创建错误时保留错误码、消息、上下文和原始原因。
- 已有底层错误时进行包装,而不是丢失原始错误链。
- 日志记录内部诊断信息。
- 返回给调用方之前进行脱敏,只暴露稳定、必要的错误码和消息。
7. 参考
关于错误码的那点事 - 知乎 在API程序设计开发中错误码如何规划设计? - 知乎 Go错误处理最佳实践 - Mohuishou
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看