这个大家肯定使用过,标准库的 errors
错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。
// 不带堆栈
err := errors.New("error msg")
fmt.Printf("%+v\n", err)
// 输出
error msg
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
前言: 不知多久能学会 Elisp 上一章: 动态模块 从本章开始,进入这份 Elisp 教...
本文是介绍 RecyclerView 入门基础 系列文章 的第四篇。如果您已经对创建 Recycl...
打开纯文本代码链接时,自动高亮代码,支持191种语言,97个主题 特性 支持191种...
【内容】: 1.利用background-image 渐变样式 2.可以利用scale缩放 3.给伪元素设...
在HTML5中,我们可以使用drawImage方法在canvas上进行画图操作,其基本代码如下...
简介 处理大量并发是 Go 语言的一大优势。语言内置了方便的并发语法,可以非常方...
微信搜索【 脑子进煎鱼了 】关注这一只爆肝煎鱼。本文 GitHub github.com/eddycj...
在CSS中,根据元素显示模式的不同元素标签被分为了两类:行内元素(inline-level...
为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世通报的深切哀悼,国务...
前言 在制作顶部菜单的时候,都会要求制作弹出的二级菜单,早先的做法是用jQuery...