当前位置:主页 > 查看内容

优雅地处理错误真是一门学问啊!

发布时间:2021-06-05 00:00| 位朋友查看

简介:errors 这个大家肯定使用过,标准库的 errors 错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。 // 不带堆栈err := errors.New("error msg")fmt.Printf("%+v\n", err)// 输出error msg pkg/e……

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 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 时,会遇到什么问题?

会遇到重复堆栈的问题!

比如,一个方法的调用链路比较长,就会出现这种情况,举个例子:

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


本文转自网络,版权归原作者所有,原文链接:https://segmentfault.com/a/1190000040102848
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐