一个(函数/方法)调用失败时,有三种主要的错误传播方式:

  • 如果没有要添加的其他上下文,并且您想要维护原始错误类型,则返回原始错误。
  • 添加上下文,使用 ["pkg/errors".Wrap] 以便错误消息提供更多上下文 ,"pkg/errors".Cause 可用于提取原始错误。
  • 如果调用者不需要检测或处理的特定错误情况,使用 [fmt.Errorf]。

建议在可能的地方添加上下文,以使您获得诸如“调用服务 foo:连接被拒绝”之类的更有用的错误,而不是诸如“连接被拒绝”之类的模糊错误。

在将上下文添加到返回的错误时,请避免使用“failed to”之类的短语以保持上下文简洁,这些短语会陈述明显的内容,并随着错误在堆栈中的渗透而逐渐堆积:

BadGood
s, err := store.New()
if err != nil {
    return fmt.Errorf(
        "failed to create new store: %v", err)
}
s, err := store.New()
if err != nil {
    return fmt.Errorf(
        "new store: %v", err)
}
failed to x: failed to y: failed to create new store: the error
x: y: new store: the error

但是,一旦将错误发送到另一个系统,就应该明确消息是错误消息(例如使用err标记,或在日志中以”Failed”为前缀)。

另请参见 Don’t just check errors, handle them gracefully. 不要只是检查错误,要优雅地处理错误

最后编辑: kuteng  文档更新时间: 2021-05-09 20:12   作者:kuteng