Выбор ответа Middle Ошибки, defer, panic и recover спрашивают часто обновлено

recover и паника в другой горутине

Вопрос

В main стоит defer func() { recover() }(), а panic происходит в горутине, запущенной из main. Что будет?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Программа упадёт: recover ловит панику только своей горутины. Паника разматывает стек только той горутины, где произошла, и выполняет только её defer.

Варианты ответа

  1. recover в main перехватит панику, программа продолжит работу
  2. Горутина молча завершится, а main продолжит работу
  3. Паника будет отложена до выхода из main и тогда снята
  4. Программа упадёт: recover ловит панику только своей горутиныправильный ответ

Разбор

Паника разматывает стек только той горутины, где произошла, и выполняет только её defer. Если в этой горутине нет recover, процесс завершается целиком, независимо от recover в других горутинах. Поэтому в каждой горутине, где возможна паника (воркеры, обработчики), нужен свой defer с recover. Горутины не умирают молча, и паника не откладывается.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме