• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go里的错误得这样写才优雅~

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

error

这个大家肯定使用过,标准库的 error 错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。

// 不带堆栈
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
}

想想看,会打印出什么?

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GO语言eclipse开发环境搭建发布时间:2022-07-10
下一篇:
Gin-Go学习发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap