error处理姿势

[TOC]

总结

  1. 对于(value, err)形式的返回,err != nil的时候,value才有意义

  2. 错误只应该被处理一次。错误要记入日志。

  3. 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
}

参考

Go进阶笔记-关于error

最后更新于

这有帮助吗?