错误包装
发布者:admin 发表于:438天前 阅读数:567 评论:0

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

如果没有要添加的其他上下文,并且您想要维护原始错误类型,则返回原始错误。

添加上下文,使用 ["pkg/errors".Wrap] 以便错误消息提供更多上下文 ,"pkg/errors".Cause 可用于提取原始错误。

如果调用者不需要检测或处理的特定错误情况,使用 [fmt.Errorf]。

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

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

Bad Good

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. 不要只是检查错误,要优雅地处理错误