如何为任何 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...)
}
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 中发现了一个错误,您应该报告它。
我目前正在使用 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...)
}
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 中发现了一个错误,您应该报告它。