golang 中 panic 和 log.fatalln() 的结果有什么不同?

问题描述

  • 日志消息进入配置的日志输出,而恐慌只会写入标准错误
  • Panic 将打印堆栈跟踪,这可能与错误完全无关。
  • defers会在程序panic时执行,但调用os.Exit立即退出,deferred的函数无法运行。

通常,仅panic用于编程错误,其中堆栈跟踪对错误的上下文很重要。如果消息不是针对程序员的,那么您只是将消息隐藏在多余的数据中。

解决方法

log.Fatalln()上的文档:

func Fatalln(v …interface{}) Fatalln 等价于 Println() 然后调用 os.Exit(1)。

Fatalln的源代码

   310  // Fatalln is equivalent to Println() followed by a call to os.Exit(1).
   311  func Fatalln(v ...interface{}) {
   312      std.Output(2,fmt.Sprintln(v...))
   313      os.Exit(1)
   314  }

似乎主要区别在于错误是否可恢复(因为您可以恢复恐慌) - 这些之间有什么更显着的不同吗?

Panic的接口定义是:

   215  // The panic built-in function stops normal execution of the current
   216  // goroutine. When a function F calls panic,normal execution of F stops
   217  // immediately. Any functions whose execution was deferred by F are run in
   218  // the usual way,and then F returns to its caller. To the caller G,the
   219  // invocation of F then behaves like a call to panic,terminating G's
   220  // execution and running any deferred functions. This continues until all
   221  // functions in the executing goroutine have stopped,in reverse order. At
   222  // that point,the program is terminated and the error condition is reported,223  // including the value of the argument to panic. This termination sequence
   224  // is called panicking and can be controlled by the built-in function
   225  // recover.
   226  func panic(v interface{})

看起来恐慌不会返回任何东西。

这是主要区别吗?否则,它们似乎在应用程序中执行相同的功能,假设没有恢复恐慌。