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
}
复制代码
想想看,会打印出什么?
是不是发现打印出的堆栈信息有重复的?
如何去解决这个问题?快来我的星球交流讨论吧。

© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)
![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
