Подтвердить что ты не робот

Когда следует использовать panic vs log.fatalln() в golang?

Из документации по 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  }

Кажется, что основное различие заключается в том, восстанавливается ли эта ошибка (так как вы можете восстановить панику) - есть ли что-то более существенное для них?

Панический интерфейс определение:

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

Кажется, что паника ничего не возвращает.

Это основное отличие? В противном случае они, похоже, выполняют одну и ту же функцию в приложении, предполагая, что паника не восстанавливается.

4b9b3361

Ответ 1

  • Сообщение журнала отправляется на сконфигурированный выход журнала, в то время как паника записывается только в stderr.

  • Panic будет печатать трассировку стека, которая может вообще не иметь отношения к ошибке.

  • Защитники будут выполняться, когда программа будет паниковать, но вызов os.Exit завершается немедленно, и отложенные функции не могут быть запущены.

В общем случае используйте только panic для программирования ошибок, где трассировка стека важна для контекста ошибки. Если сообщение не нацелено на программиста, вы просто скрываете сообщение в избыточных данных.