error处理姿势
[TOC]
总结
- 对于 - (value, err)形式的返回,- err != nil的时候,value才有意义
- 错误只应该被处理一次。错误要记入日志。 
- error包需要注意 - 自己的应用程序中,使用 - errors.New或者- errors.Errorf返回错误
- 调用其他包内的函数或者是当前项目里的其他函数,直接 - return nil即可
- 如果使用的是第三方库或者是go的基础库,这个时候应该使用 - github.com/pkg/errors包的- Wrap或者- Warpf保存堆栈信息,同时添加自定义的上下文信息。
- 直接返回错误,在程序工作入口使用 - %+v记录堆栈详情。
- 使用 - errors包的- Unwrap方法获取根因错误来和自定义错误进行等值判断。或者使用- Is函数将错误与值进行比较;使用- As测试错误是否为特定类型
- 一旦错误被处理,包括你打印日志,或者降级处理等,这个时候你就不应该再向上抛出err,而应该return nil。 
 
使用Is和As检查错误
Go 1.13的errors包中包括了两个用于检查错误的新函数:Is和As。
Is函数将错误与值进行比较。
// Similar to:
//   if err == ErrNotFound { … }
if errors.Is(err, ErrNotFound) {
    // something wasn't found
}As函数用于测试错误是否为特定类型。
// Similar to:
//   if e, ok := err.(*QueryError); ok { … }
var e *QueryError
if errors.As(err, &e) {
    // err is a *QueryError, and e is set to the error's value
}参考
最后更新于
这有帮助吗?