errors

这个大家必定应用过,规范库的 errors 谬误实现比较简单,无奈进行堆栈追溯,对于产生谬误时的下层调用者来讲不是很敌对,无奈取得谬误的调用链详细信息。

// 不带堆栈err := errors.New("error msg")fmt.Printf("%+v\n", err)// 输入error msg

pkg/errors

github.com/pkg/errors 反对堆栈信息,能够取得谬误的调用链详细信息。

一般的

// 带堆栈err := errors.New("error msg")fmt.Printf("%+v\n", err)// 输入error msgmain.main        /Users/xinliang/go/project/demo/err/err.go:14runtime.main        /usr/local/go/src/runtime/proc.go:225runtime.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 时,会遇到什么问题?

会遇到反复堆栈的问题!

比方,一个办法的调用链路比拟长,就会呈现这种状况,举个例子:

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}

想想看,会打印出什么?

是不是发现打印出的堆栈信息有反复的?

如何去解决这个问题?快来我的星球交换探讨吧,https://t.zsxq.com/iIUVVnA