返回博客

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

在使用 Go 语言编写代码时,使用 log.Fatal 打印 cmd 命令错误信息导致程序直接退出,无法打印后续的 cmdStdout 和 cmdStderr 信息。log.Fatal 函数会打印错误信息后直接调用 os.Exit(1) 终止程序运行。将 log.Fatal(err) 修改为 log.Println(err) 后问题解决。

Mt.r
|

写 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)
}