这个你们确定使用过,标准库的 errors
错误实现比较简单,没法进行堆栈追溯,对于产生错误时的上层调用者来说不是很友好,没法得到错误的调用链详细信息。git
// 不带堆栈 err := errors.New("error msg") fmt.Printf("%+v\n", err) // 输出 error msg
github.com/pkg/errors
支持堆栈信息,能够得到错误的调用链详细信息。github
// 带堆栈 err := errors.New("error msg") fmt.Printf("%+v\n", err) // 输出 error msg main.main /Users/xinliang/go/project/demo/err/err.go:14 runtime.main /usr/local/go/src/runtime/proc.go:225 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1371
err := errors.Wrap(err error, message string) 或 err := errors.Wrapf(err error, format string, args ...interface{})
err := errors.WithStack(err error)
err := errors.WithMessage(err error, message string) 或 err := errors.WithMessagef(err error, format string, args ...interface{})
你们想想,咱们在使用 pkg/errors
时,会遇到什么问题?code
会遇到重复堆栈的问题!orm
好比,一个方法的调用链路比较长,就会出现这种状况,举个例子:get
func main() { err := func1() fmt.Printf("%+v\n", errors.Wrapf(err, "func1 error occurred")) } func func1() error { err := func2() return errors.Wrapf(err, "func2 error occurred") } func func2() error { err := errors.New("error msg") return err }
想一想看,会打印出什么?string
是否是发现打印出的堆栈信息有重复的?it
如何去解决这个问题?快来个人星球交流讨论吧,https://t.zsxq.com/iIUVVnAasm