Golang Go语言中 error 包含堆栈信息
Golang Go语言中 error 包含堆栈信息
大型项目中,打印 error 就是个字符串,非常难以调试,很痛苦。
我记得之前看到文章说 xerrors 的 error 包含堆栈功能会合到标准库里面,为啥现在还没有合并?
go 未来还会支持 error 中包含堆栈信息这个功能吗?
有啊 具体函数名忘了 你查一下 error package
更多关于Golang Go语言中 error 包含堆栈信息的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
因为更好的错误处理方案一直没有定论,所以不会把一个临时解决方案合入标准库
go 初始的东西,语言本身,核心概念就是凑合
go 后续的提案等等都是绝不凑合,没找到和口味的之前绝不加入新东西
用 zerolog 等 logger, 可以附带 stack trace
也许可以考虑这样的实现方式,每一层调用者在发现调用的函数返回非空 nil 后,都使用 fmt.Errorf()提供上下文后再向 return 到上一层。
例如:<br> err := client.Ping(ctx).Err()<br> if err != nil {<br> err = fmt.Errorf("redis PING: %w", err)<br> return nil, err<br> }<br>
这样到了最外层(一般是打日志的时候),文本化的 err 会形如:running up: program init: redis PING: network IO timeout
在大部分情况下,我自己感觉这个都比堆栈来得实用。
import "github.com/pkg/errors"
errors.Wrap / errors.Wrapf
第一次错误出现的地方
errors.Wrap / errors.Wrapf
中间每一层都直接 return
最外一层打印
https://goframe.org/pages/viewpage.action?pageId=1114255
goframe 的这个错误处理包还可以,
gerror.Wrap 包装栈信息
gerror.WrapCode 还可以带自定义的业务 api code
https://github.com/pkg/errors/blob/master/errors.go#L145-L153
errors.WithStack
大道至简, 你不懂.
5 楼正解
在Go语言中,错误(error
)类型是一个内置的接口类型,用于表示在程序执行过程中出现的异常情况。默认情况下,Go语言中的错误对象并不包含堆栈信息,这与其他一些编程语言(如Java、Python)有所不同。
然而,在实际开发中,为了调试和排查问题,我们往往需要知道错误发生的具体位置(即堆栈信息)。为了实现这一点,可以采用以下几种方法:
-
使用第三方库:有许多第三方库(如
pkg/errors
、go-errors
等)提供了带有堆栈信息的错误处理功能。这些库允许你在创建错误时自动附加堆栈信息,并在后续处理中方便地打印或检查这些信息。 -
自定义错误类型:你也可以通过自定义错误类型来包含堆栈信息。这通常涉及定义一个结构体,该结构体包含一个
error
类型的字段和一个用于存储堆栈信息的字符串字段。在创建错误时,你可以使用debug/stack
包来捕获当前的堆栈信息。 -
使用Go 1.13+的特性:从Go 1.13版本开始,标准库中的
fmt
包提供了%+v
动词,用于在打印错误时自动展开错误链并显示堆栈信息(前提是错误对象是由支持这一特性的库创建的)。
综上所述,虽然Go语言中的error
类型默认不包含堆栈信息,但你可以通过引入第三方库、自定义错误类型或使用Go 1.13+的特性来方便地获取和显示堆栈信息,从而更有效地进行错误调试和排查。