Перехват только в отложенной функции в 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 нужно вызвать
перехват, чтобы поймать останов из тела
этой же функции.