В чем разница между паникой и Fatal Error

«В чем разница между паникой и Fatal Error» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паника (panic) в Go — это механизм для обработки исключительных ситуаций, который можно перехватить с помощью recover. Она останавливает выполнение текущей функции, запускает отложенные вызовы (defer) и поднимается вверх по стеку, пока не будет обработана или завершит программу.

Fatal Error (например, log.Fatal или os.Exit(1)) — это немедленное завершение программы без выполнения отложенных вызовов (defer не срабатывает) и без возможности восстановления.

Пример:

func main() {
    defer fmt.Println("Это не выполнится при Fatal")
    log.Fatal("Программа завершена") // defer не сработает
}

func handlePanic() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
        }
    }()
    panic("Что-то пошло не так") // defer сработает
}

Ключевые отличия:

  • panic + recover — для обработки ошибок в рантайме.
  • Fatal — для критических ошибок, когда продолжение невозможно.
  • defer работает только с panic.