Golang Go语言中 error 包含堆栈信息

发布于 1周前 作者 yibo5220 来自 Go语言

Golang Go语言中 error 包含堆栈信息

大型项目中,打印 error 就是个字符串,非常难以调试,很痛苦。

我记得之前看到文章说 xerrors 的 error 包含堆栈功能会合到标准库里面,为啥现在还没有合并?

go 未来还会支持 error 中包含堆栈信息这个功能吗?

13 回复

有啊 具体函数名忘了 你查一下 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

最外一层打印

在你认为应该被跟踪错误的地方不要直接 return err

可以换成
return fmt.Errorf(“error can not xxx: %w”, err)

https://goframe.org/pages/viewpage.action?pageId=1114255
goframe 的这个错误处理包还可以,
gerror.Wrap 包装栈信息
gerror.WrapCode 还可以带自定义的业务 api code

大道至简, 你不懂.

在Go语言中,错误(error)类型是一个内置的接口类型,用于表示在程序执行过程中出现的异常情况。默认情况下,Go语言中的错误对象并不包含堆栈信息,这与其他一些编程语言(如Java、Python)有所不同。

然而,在实际开发中,为了调试和排查问题,我们往往需要知道错误发生的具体位置(即堆栈信息)。为了实现这一点,可以采用以下几种方法:

  1. 使用第三方库:有许多第三方库(如pkg/errorsgo-errors等)提供了带有堆栈信息的错误处理功能。这些库允许你在创建错误时自动附加堆栈信息,并在后续处理中方便地打印或检查这些信息。

  2. 自定义错误类型:你也可以通过自定义错误类型来包含堆栈信息。这通常涉及定义一个结构体,该结构体包含一个error类型的字段和一个用于存储堆栈信息的字符串字段。在创建错误时,你可以使用debug/stack包来捕获当前的堆栈信息。

  3. 使用Go 1.13+的特性:从Go 1.13版本开始,标准库中的fmt包提供了%+v动词,用于在打印错误时自动展开错误链并显示堆栈信息(前提是错误对象是由支持这一特性的库创建的)。

综上所述,虽然Go语言中的error类型默认不包含堆栈信息,但你可以通过引入第三方库、自定义错误类型或使用Go 1.13+的特性来方便地获取和显示堆栈信息,从而更有效地进行错误调试和排查。

回到顶部