要么返回错误值,要么输出日志,别两样都做

原文约3900字,阅读约需10分钟。发表于:

本文永久链接 – https://tonybai.com/2024/04/14/either-return-error-or-log-them-do-not-do-both 1. 缘起 这周,一个产品团队内进行Go代码评审时,得到了一个结论:所有的if err != nil的地方都应该输出错误日志。然而,这种做法并不是最佳实践,它存在一些问题。 首先,打印过多的错误日志会导致日志文件变得冗长和难以阅读。其次,重复的错误信息会增加冗余。此外,每一层都打印错误日志,一旦错误信息设计不当,可能会导致上下文信息的丢失。 让我们来看一个示例,说明为什么同时输出错误日志和返回错误值会导致问题。假设我们有一个五层的Go函数调用栈,其中最底层的函数level4Function出现了一个错误: package main import ( "fmt" "log" ) func main() { if err := topFunction(); err != nil { log.Printf("Error: %v", err) } } func topFunction() error { err := level1Function() if err != nil { log.Printf("topFunction: %v", err) return err } return nil } [...]

本文讨论了在Go代码中同时输出错误日志和返回错误值的问题,并介绍了一种更好的实践方法。通过使用wrapped error构建错误链,可以避免重复的错误日志,并保留错误的上下文信息,方便定位和解决问题。文章强调在编写Go代码时,要么返回错误值,要么输出日志,不要两者都做。

要么返回错误值,要么输出日志,别两样都做
相关推荐 去reddit讨论