Что такое panic и recover?

Middle
1.8k просмотров
AFK Offer AI

panic — аварийное завершение. Раскручивает стек, выполняет все defer, и если никто не поймал — программа падает с трейсом.

recover — ловит panic, но работает только внутри deferred-функции.

func safeDiv(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("caught panic: %v", r)
        }
    }()
    return a / b, nil // panic при b=0
}

Правила:

  • Не используй panic для обычных ошибок — для этого есть error
  • panic допустим для «невозможных» состояний (баг в логике) или при инициализации (MustCompile)
  • В production-сервисах recover ставят в middleware, чтобы один запрос не уронил весь сервер

Следующий вопрос

Внутреннее устройство интерфейсов?