Sobes.tech
Назад к вопросам
Middle+
2

Что такое паника в Go и когда её нельзя поймать?

Компании, где спрашивали
МВидео/эльдорадо

Ответ от нейросети

sobes.tech AI

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

Панику можно поймать с помощью функции recover, которая должна вызываться внутри отложенной функции. Если recover вызывается вне отложенной функции, она не сможет поймать панику.

Однако есть ситуации, когда паника не может быть поймана:

  • Если паника происходит в главной горутине и не поймана, программа завершится аварийно.
  • Если паника происходит в системных вызовах или в runtime, которые не предоставляют возможность recover.
  • Если recover вызывается не в контексте отложенной функции, она не сможет предотвратить завершение программы.

Пример:

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Поймали панику:", r)
        }
    }()
    panic("что-то пошло не так")
}

В этом примере паника будет поймана и обработана, программа не завершится аварийно.