假设我有一些代码,如下所示:

value, err := some3rdpartylib.DoSomething()
if err != nil {
    panic(err)
}

在 case err != nil中,我会得到如下结果:

panic: some error explanation here

goroutine 1 [running]:
main.main()
    /tmp/blabla/main.go:6 +0x80

这个堆栈跟踪是完全合法的,但有时这些错误消息可能无法澄清发生了什么,所以我想深入研究第三方库的源代码,以调查到底是什么导致了这个错误被返回.然而,当我的代码像这样惊慌失措时,无法获得返回此错误的实际位置.

再进一步说明一下:因为我来自抛出异常的JVM世界,所以我可以完全跟踪抛出异常的确切代码行,因此可以很容易地找到位置并查看哪里出了问题.Go堆栈跟踪正好在我的代码死机的地方结束,因此在我的情况下没有太大用处.

我已经创建了一个playground here,理想情况下,我希望能够跟踪错误到它实际返回的位置,而不是panic .(例如至第17,return "", errors.New("some error explanation here")行)

这有可能吗?

推荐答案

简而言之:这是不可能的. 从errors are values年起,他们没有受到任何特殊对待.因此,当函数(通常)返回时,堆栈不再可用(即.另一个函数调用可以重写由返回错误函数堆栈使用的存储器).

go1引入了一个名为trace的工具.5,但目前还没有全面的教程,我找到的任何一本都没有说会包括这种功能.

Go相关问答推荐

出口上下文值密钥的安全方法?

如何修复在Go API中使用Gin Framework的请求资源上没有使用Gin Framework的请求源的消息?''

如何修复 Go 中协议缓冲区定义中重新定义的字段?

Go:为什么我不能比较 net.Addr

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

`docker system df` 与 `/system/df` (docker api 端点)

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

使用goroutines在Golang中验证 struct

Go time.Parse 无效的 ISO 日期

如何用mpb创建两行进度条?

从给定顶点查找图形中所有闭合路径的算法

在本地 go 应用程序上获取秘密的正确策略

闭包所处的环境范围是什么?

在 .go 文件中运行一个函数和在 Go 模板中调用它有什么区别?

使用 Golang 在字符串中循环重复数据

try 运行 docker-compose up -d 时出现错误

函数调用中的类型参数panic

通用函数与外部包中的常见成员一起处理不同的 struct ?

如何从 tinygo webassembly 目标返回对象

有没有办法在golang中映射一组对象?