Контекст: обработка исключений в Go, concurrency panic аварийно прекращает выполнение текущей горутины если panic не перехвачен через recover, горутина завершится с ошибкой остальная программа продолжит выполняться, если это не main-горутина panic в main-горутины завершает работу всего приложения recover даёт возможность перехватить и обработать panic внутри defer ф-ции корректная обработка panic предотвращает крах сервера/приложения
Что произойдёт при panic в горутине Go?
Контекст: обработка исключений в Go, concurrency panic аварийно прекращает выполнение текущей горутины если panic не перехвачен через recover, горутина завершится с ошибкой остальная программа продолжит выполняться,…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Что произойдёт при panic в горутине Go?
- Контекст: обработка исключений в Go, concurrency
- panic аварийно прекращает выполнение текущей горутины
- если panic не перехвачен через recover, горутина завершится с ошибкой
- остальная программа продолжит выполняться, если это не main-горутина
- panic в main-горутины завершает работу всего приложения
- recover даёт возможность перехватить и обработать panic внутри defer ф-ции
- корректная обработка panic предотвращает крах сервера/приложения
Детально: В Go panic предназначен для аварийных ситуаций и прерывает выполнение горутины. В отличие от исключений в других языках, без recover он завершает именно текущую горутину. Благодаря этому ошибку можно изолировать и не допустить неожиданного падения всей программы. Использовать recover следует осторожно, чтобы не замаскировать настоящие ошибки.
Подробный ответ
Основной ответ
Когда в горутине Go возникает panic, её выполнение сразу прекращается, после чего запускается "разворачивание стека" (stack unwinding): все отложенные вызовы defer выполняются в обратной последовательности. При этом panic одной горутины не завершает аварийно всю программу, если ошибка возникла не в главной горутине (main). Если не обработать panic с помощью recover, горутина завершится с ошибкой, а runtime напечатает стек трейс panic.
Ключевые моменты
- Изоляция panic: panic напрямую не передаётся другим горутинам. С точки зрения ошибок каждая горутина фактически изолирована.
- Механизм
deferиrecover: если вызватьrecover()в функции, отложенной посредствомdefer, panic можно перехватить, не допустить падения горутины и продолжить выполнение. - Главная горутина: необработанный panic в главной горутине приводит к аварийному завершению программы.
- Начиная с Go 1.14+ стек автоматически предварительно сохраняется, благодаря чему отлаживать panic стало удобнее.
Практический контекст
В реальных сервисах горутины обычно запускают через обёртку, применяющую defer + recover для перехвата panic. Это предотвращает неконтролируемый краш всего приложения и особенно важно для серверов и долгоживущих воркеров, которые не должны завершаться из-за неожиданных ошибок в дочерних горутинах.