如何为任何 OS 执行二进制文件在 Go 中禁用堆栈跟踪信息

How to Disable Stack Trace Info in Go for any OS Executing the Binary

我目前正在使用 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,但这对我测试过的其他操作系统没有影响。

正如@Burak 提到的,您想使用内置的 Go 函数 recover. There's a good Go blog post on all the subtleties of panic and recovery

如果您想覆盖整个应用程序堆栈,只需在 main 级别通过 defer 函数注册 recover

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

I've tried utilizing the GOBACKTRACE environment variable when building my binary and setting its value to GOBACKTRACE=none, but this has no effect on other operating systems I've tested on.

环境变量叫GOTRACEBACK,不是GOBACKTRACE

此外,您可以使用 debug.SetTraceback("none") 来达到同样的效果,尽管这仍然可以通过 GOTRACEBACK 环境变量来覆盖。

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