Выбор ответа Senior Ошибки, defer, panic и recover обновлено

Где recover работает, а где нет

Вопрос

В каком случае recover() остановит панику?

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

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

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

Коротко

Правильный ответ: Прямо в функции, отложенной через defer: defer func() { recover() }(). recover останавливает панику, только если его вызвала сама отложенная функция, напрямую.

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

  1. Прямо в функции, отложенной через defer: defer func() { recover() }()правильный ответ
  2. В хелпере, вызванном из отложенной функции: defer func() { helper() }()
  3. При прямом откладывании встроенной функции: defer recover()
  4. Вызван в начале функции заранее, до того как случится паника

Разбор

recover останавливает панику, только если его вызвала сама отложенная функция, напрямую. Во вложенном хелпере он вернёт nil. defer recover() тоже не работает: recover вызывается рантаймом как отложенная функция, а не изнутри отложенной функции, и спецификация говорит, что тогда он возвращает nil. Вызов до паники просто возвращает nil.

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

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

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