Получить доступ

Когда в Go используют panic и как работает recover?

JuniorОшибки и panic
Ещё спрашивают так:
  • Чем panic отличается от возврата ошибки?
Коротко

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

  • recover работает только в defer той же горутины
  • Паника в горутине без recover роняет всю программу
  • HTTP-серверы ставят recover в middleware, чтобы один запрос не убил сервис

А ещё Must-функции (regexp.MustCompile) паникуют при инициализации — там это уместно

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Ошибка или panic. Ожидаемые сбои (нет файла, сеть недоступна, неверный ввод) — возвращаемые ошибки. Panic — когда продолжать бессмысленно или это баг: нарушение контракта, недостижимый код, невозможность инициализации при старте.

Горутины. Паника не передаётся в родительскую горутину: необработанная паника в любой горутине завершает весь процесс. Поэтому фоновые горутины, выполняющие непроверенный код, оборачивают recover-ом.

Не перехватить: фатальные ошибки рантайма — конкурентная запись в map, нехватка памяти, взаимоблокировка всех горутин — завершают программу без возможности recover.

Пример

func safe(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if rec := recover(); rec != nil {
                log.Printf("panic: %v\n%s", rec, debug.Stack())
                http.Error(w, "internal error", 500)
            }
        }()
        h(w, r)
    }
}

Что хотят услышать

  • Когда panic уместен.
  • Механика recover через defer.
  • Паника в горутине.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем