3 回答
TA贡献1934条经验 获得超2个赞
我认为有一种更简单的方法可以实现这一目标。您可以尝试包装错误使用golang“默认”的第三方库的错误包:
您需要定义要由您实现的接口error:
type stackTracer interface {
StackTrace() errors.StackTrace
}
然后在包装/处理错误时使用它:
err, ok := errors.(stackTracer) // ok is false if errors doesn't implement stackTracer
stack := err.StackTrace()
fmt.Println(stack) // here you'll have your stack trace
TA贡献1842条经验 获得超12个赞
正如其他人指出的那样,跟踪 go 中的错误并非易事。有像juju/errgo这样的项目,它允许您包装错误,然后追溯这些错误。为了让它工作起来很艰难,您必须在整个项目中始终如一地使用它们,这不会帮助您解决 3rd 方库中的错误或处理后永远不会返回的错误。
因为这是一个很常见的问题,我真的对此很恼火,所以我编写了一个小型调试实用程序,它将向 go 文件添加调试代码,该文件记录每个返回的错误(实现的值error)以及将其返回到 STDOUT 的函数(如果您需要更高级的日志记录,只需在项目中 hack 记录器,这真的很简单)。
安装
go get github.com/gellweiler/errgotrace
用法
要调试当前目录中的所有文件:
$ find . -name '*.go' -print0 | xargs -0 errgotrace -w
从 go 文件中删除添加的调试代码:
$ find . -name '*.go' -print0 | xargs -0 errgotrace -w -r
然后只需简单地编译和运行您的代码或您的测试用例。
样本输出
[...]
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectKey: EOF token found
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectItem: EOF token found
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectKey: EOF token found
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectItem: EOF token found
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectKey: At 3:4: nested object expected: LBRACE got: ASSIGN
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectItem: At 3:4: nested object expected: LBRACE got: ASSIGN
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.objectList: At 3:4: nested object expected: LBRACE got: ASSIGN
2017/12/13 00:54:39 [ERRGOTRACE] parser.*Parser.Parse: At 2:31: literal not terminated
2017/12/13 00:54:39 [ERRGOTRACE] parser.Parse: At 2:31: literal not terminated
2017/12/13 00:54:39 [ERRGOTRACE] hcl.parse: At 2:31: literal not terminated
2017/12/13 00:54:39 [ERRGOTRACE] hcl.ParseBytes: At 2:31: literal not terminated
2017/12/13 00:54:39 [ERRGOTRACE] formula.parse: parsing failed
[...]
从这个输出中可以看出,很容易判断错误最初发生在哪个函数中。一旦你知道了,你就可以使用调试器来获得更多的上下文。
- 3 回答
- 0 关注
- 226 浏览
添加回答
举报