Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpPnDO 55 of 280 menu
◀ ▶

Перехват только в отложенной функции в Go

Перехват срабатывает лишь внутри функции, которую отложили до выхода. Команда recover смотрит на текущую панику только пока выполняется такая отложенная функция во время размотки стека; в обычном теле функции она не видит останов.

Если вызвать recover прямо в main или в середине обычной функции, результат будет пустым: паники в этот момент еще нет или размотка уже прошла мимо.

Сначала проверим вызов вне отложенной функции:

package main import "fmt" func main() { fmt.Println(recover()) panic("boom") }

Первая печать показывает nil: на этой строке перехватывать нечего. Дальше программа все равно падает, потому что останов не поймали.

Сравним с перехватом внутри defer:

package main import "fmt" func main() { defer func() { if msg := recover(); msg != nil { fmt.Println("saved") } }() panic("boom") fmt.Println("never") }

На экране одна строка "saved". Отложенная функция сработала при размотке и увидела панику. Без defer такой же вызов recover в теле main после останова уже не успел бы помочь.

Дан следующий код:

func try() { fmt.Println(recover()) }

Вызовите try из main до останова с текстом "x" и скажите, что напечатает try.

Дан следующий код:

package main import "fmt" func main() { defer fmt.Println("defer line") if recover() != nil { fmt.Println("got") } panic("stop") }

Скажите, появится ли на экране "got" перед завершением программы.

Скажите, где в main нужно вызвать перехват, чтобы поймать останов из тела этой же функции.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить