Skip to content

Go log.Fatal 导致程序提前退出的问题

Published: at 09:20 AMSuggest Changes

写 Go 代码的时候,我期望将 cmd 的错误信息打印出来,代码如下

var cmdOut, cmdErr bytes.Buffer
cmd.Stdout = &cmdOut
cmd.Stderr = &cmdErr
err := cmd.Run()
if err != nil {
  log.Fatal(err)
  // log.Println(err)
}
cmdStdout := ConvertByte2String([]byte(cmdOut.String()), "GB18030")
cmdStderr := ConvertByte2String([]byte(cmdErr.String()), "GB18030")
fmt.Println("cmdStdout:", cmdStdout)
fmt.Println("cmdStderr:", cmdStderr)

ping 一个不通的域名产生了报错,什么都没有打印出来,而是给了个返回码 2。

当时我没有意识到这个问题,把代码发到群里,一个大佬 Cavan.xu 跑了一下代码,指出了问题出现在 log.Fatal 上。

改了一下,程序如期运行。

// log.Fatal(err)
log.Println(err)

看一下这个 log.Fatal 源码。Fatal 等价于 Print() 然后调用 os.Exit(1)。

// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
	std.Output(2, fmt.Sprint(v...))
	os.Exit(1)
}

Previous Post
JavaScript 复制文本到剪贴板的问题及解决方法
Next Post
Go 后台运行方法