我目前正在使用 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,但这对我测试过的其他操作系统没有影响。
我在构建二进制文件时尝试使用 GOBACKTRACE 环境变量并将其值设置为 GOBACKTRACE=none,但这对我测试过的其他操作系统没有影响。
GOTRACEBACK
,而不是 GOBACKTRACE
。
debug.SetTraceback("none")
来实现相同的效果,尽管这仍然可以通过 GOTRACEBACK
环境变量覆盖。
如果您使用正确的命名,它应该可以工作。如果它不起作用,恭喜你:你在 golang 中发现了一个错误,你应该报告它。
顺便说一句,你的程序因为一个很好的原因而恐慌:你正在尝试对数组执行越界读取
myarr
;您可能希望解决这个问题,以便一开始就不会发生恐慌。
正如 @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...)
}