经过多年使用php和js的经验,我习惯了对错误进行堆栈跟踪,并直接从错误报告中查看错误发生的位置。 几年前在Go上重新播种时,令我有些惊讶的是Go具有不同的规则,您需要猜测某些行上的堆栈跟踪,例如“无效字符”。 如果它发生在产品上并且不知道如何复制它,那么这将变成一个整体吸引力。
由于我确定没有人会遭受此痛苦,因此我制作了一个可以做到这一点的软件包:

→
GitHub他所做的只是:
- 将堆栈跟踪添加到错误。
- 显示发生此错误的堆栈跟踪和源片段(当然,在存在源的情况下)。
添加堆栈跟踪
有几种使用堆栈跟踪创建错误的方法:
重新包装错误后,堆栈跟踪将保持不变并且不会被覆盖,如果不知道错误是否已经具有堆栈跟踪,这将非常方便。
该代码可能看起来像这样:
func decodeFile(path string, data interface{}) error { b, err := ioutil.ReadFile(path) if err != nil { return tracerr.Wrap(err) } err = json.Unmarshal(b, data)
堆栈跟踪显示
通过
if err != nil { return err }
直到100500出现错误之后,在
main()
(或它的处理位置)中返回它的家园,您很可能希望显示或抵押它。
有几个选项:全部用作“打印”(打印文本)或“打印”(返回文本):
1)显示错误文本和堆栈跟踪:
tracerr.Print(err)
2)显示错误文本,堆栈跟踪和源片段(默认为6行):
tracerr.PrintSource(err)
3)相同,但颜色通常更丰富:
tracerr.PrintSourceColor(err)
4)您可以将显示多少行代码作为参数传递:
tracerr.PrintSource(err, 9) tracerr.PrintSourceColor(err, 9)
5)或传递2个可选参数,要显示的错误行之前和之后多少行:
tracerr.PrintSource(err, 5, 2) tracerr.PrintSourceColor(err, 5, 2)
问题
我已经收到了一些反馈,因此我允许自己提前回答一些已经提出的问题。
问:这仅适用于调试吗? 有一个调试器。答:这不仅适用于调试,还可以在产品上记录有关堆栈跟踪信息甚至源代码片段的错误,根据我的经验,这将大大简化然后分析这些错误的过程。
问:有一个超级包pkg /错误,为什么不使用它?答:是的,我本人完全使用它并感到很高兴,但是由于以下原因,它不适合我:
1)没有简单的方法可以立即与源一起显示堆栈跟踪。
2)重新包装错误时(例如,将错误高出一级),堆栈跟踪将被信息量较小的堆栈跟踪所覆盖。
3)每转一圈都必须发送其他错误文本,在我看来,编写/阅读代码时会有些开销。
问:在Go中,错误也不例外,您完全不能这样做。答:我同意,Go中的错误也不例外。 如果您希望以
if err != nil { return err }
其他方式处理成千上万-当然,这是您的选择。 您只能包装作为异常处理的错误。
问:Stectrace增加了性能开销。答:是的,它增加了,但这仅与产生大量错误的地方有关,如果紧急的话,不要在此处添加堆栈跟踪(我相信在大多数情况下,此开销可以忽略不计)。
总的来说,我希望这个软件包能使您的梳棉机的生活更加轻松,我很高兴收到您的任何反馈,谢谢。