增加Go错误内容-github.com/ztrue/tracerr

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

由于我确定没有人会遭受此痛苦,因此我制作了一个可以做到这一点的软件包:

golang错误输出

GitHub

他所做的只是:

  1. 将堆栈跟踪添加到错误。
  2. 显示发生此错误的堆栈跟踪和源片段(当然,在存在源的情况下)。

添加堆栈跟踪


有几种使用堆栈跟踪创建错误的方法:

//   err := tracerr.New("some error") //   Errorf,    ,   fmt.Errorf err := tracerr.Errorf("some error %d", num) //    ,    err = tracerr.Wrap(err) 

重新包装错误后,堆栈跟踪将保持不变并且不会被覆盖,如果不知道错误是否已经具有堆栈跟踪,这将非常方便。

该代码可能看起来像这样:

 func decodeFile(path string, data interface{}) error { b, err := ioutil.ReadFile(path) if err != nil { return tracerr.Wrap(err) } err = json.Unmarshal(b, data) //  err = nil,   nil return tracerr.Wrap(err) } 

堆栈跟踪显示


通过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增加了性能开销。
答:是的,它增加了,但这仅与产生大量错误的地方有关,如果紧急的话,不要在此处添加堆栈跟踪(我相信在大多数情况下,此开销可以忽略不计)。

总的来说,我希望这个软件包能使您的梳棉机的生活更加轻松,我很高兴收到您的任何反馈,谢谢。

Source: https://habr.com/ru/post/zh-CN440008/


All Articles