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, чтобы один запрос не уронил весь сервер