Вопрос проверяет знание механизма обработки ошибок и аварийных ситуаций в Go.
defer откладывает выполнение функции до выхода из текущей. panic прерывает обычное выполнение и начинает раскрутку стека. recover позволяет поймать panic внутри defer и продолжить выполнение программы.
Go не имеет исключений как в Java, но предоставляет комбинацию panic/recover и отложенные вызовы defer.
defer — гарантирует вызов функции перед выходом из текущей, часто используется для Close() ресурсов.
panic — сигнализирует об аварийной ситуации, выполнение текущей горутины прерывается, начинается раскрутка стека и вызовы defer.
recover — может быть вызван внутри отложенной функции, чтобы остановить panic и вернуть контроль.
func safeDivide(a, b int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
if b == 0 {
panic("division by zero")
}
fmt.Println(a / b)
}Вывод:
defer — всегда освобождай ресурсы.
panic — используй только для truly exceptional situations.
recover — изолируй панику, чтобы сервис не падал целиком.