如何在 Go 中为任何执行二进制文件的操作系统禁用堆栈跟踪信息

问题描述 投票:0回答:2

我目前正在使用 Go 构建 CLI,并尝试禁用由于恐慌而产生的任何回溯。我相信我的代码有很好的错误处理能力,但现在想抑制任何恐慌消息(对于 Go 来说相当新)。

我目前在 main.go 函数中添加了以下内容(故意引起恐慌):

var myarr [2]string
myarr[0] = "Foo"
myarr[1] = "Bar"
for i := range myarr {
    fmt.Println(myarr[i+1])
} 

我得到的结果是:

goroutine 1 [running]:
Bar
panic: runtime error: index out of range [2] with length 2

main.main()
        {directory where main.go is located}/main.go:23 +0x207

如何抑制此错误,以便拥有可执行二进制文件的任何人都看不到此错误?

我在构建二进制文件时尝试使用 GOBACKTRACE 环境变量并将其值设置为 GOBACKTRACE=none,但这对我测试过的其他操作系统没有影响。

go operating-system backtrace
2个回答
2
投票

我在构建二进制文件时尝试使用 GOBACKTRACE 环境变量并将其值设置为 GOBACKTRACE=none,但这对我测试过的其他操作系统没有影响。

环境变量称为

GOTRACEBACK
,而不是
GOBACKTRACE

此外,您可以使用

debug.SetTraceback("none")
来实现相同的效果,尽管这仍然可以通过
GOTRACEBACK
环境变量覆盖。

如果您使用正确的命名,它应该可以工作。如果它不起作用,恭喜你:你在 golang 中发现了一个错误,你应该报告它。

顺便说一句,你的程序因为一个很好的原因而恐慌:你正在尝试对数组执行越界读取

myarr
;您可能希望解决这个问题,以便一开始就不会发生恐慌。


0
投票

正如 @Burak 提到的,你想使用内置的 Go 函数 recover。有一篇很好的 Go 博客文章,介绍了恐慌和恢复的所有微妙之处。

如果您想全面覆盖整个应用程序堆栈,只需通过

recover
级别的
defer
函数注册
main
即可:

func main() {

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("unexpected problem encountered - aborting")
            // optionally log `r` to an exception log - so users may email to developer
            os.Exit(1)
        }
    }()

    run(os.Args...)
}

https://play.golang.org/p/b8qYnlNZsr5

© www.soinside.com 2019 - 2024. All rights reserved.