type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Jun 23, 2024 01:47 AM
Parent item
领域
- 不要直接返回底层错误,最底层的错误使用New生成,或者
%w
包装基础库的错误
- 不要针对错误内容和错误类型进行处理, 要针对错误行为进行处理
- 不要处理2次错误,例如既将错误写进了日志,又将错误返回给上层调用者
- 不要根据定义的error来判断error
理由:会导致定义 error 和使用 error 的包之间建立了依赖关系。不过例子中的io 包是标准库的包,勉强还 Ok,如果是自定义error,容易引起循环引用的问题
- 不要把error类型对外导出
理由: 会在定义错误和使用错误的包之间形成依赖关系。
- 不要忽略错误,对 error 做降级处理
error
处理最佳实践1:使用error
嵌套
适合处理各种业务逻辑错误。
嵌套方法
使用
fmt.Errorf
加上 %w
格式符来生成一个嵌套的 error
。Unwrap方法
将嵌套的
error
解析出来,多层嵌套需要调用 Unwrap
函数多次,才能获取最里层的 error
。Is方法
判断
err
是否和 target
是同一类型,或者 err
嵌套的 error
有没有和 target
是同一类型的,如果是,则返回 true
。As方法
从
err
错误链里找到和 target
相等的并且设置 target
所指向的变量。error
处理最佳实践2:统一error
处理
适合代码改动较少,业务逻辑较长但清晰稳定的场景。
将
error
保存到对象内部,按顺序执行处理逻辑后, 最后检查是否产生error
。error
处理最佳实践3:简化if err != nil
优化前, 往w的Writer中写入数据,每次写入都要判断
err != nil
:优化后,对
Writer
做一个包装,增加一个err
变量保存写入时的错误, 在每次写入前都判断一下是否有err
: