Неперехваченный останов в Go
Если останов никто не перехватил, программа заканчивается, а код после вызова не идет. Среда печатает сообщение и трассировку стека, процесс завершается с ненулевым кодом выхода.
Размотка поднимается из функции, где сработала паника, через всех вызывающих. Пока на пути нет отложенного перехвата, ни один уровень не продолжает работу после проблемного вызова.
Вызовем функцию с остановом и строку после нее:
package main
import "fmt"
func fail() {
panic("stop")
}
func main() {
fmt.Println("before")
fail()
fmt.Println("after")
}
На экране только "before" из main
и служебный вывод о панике. "after"
не выполняется: до этой строки управление
не вернулось.
Тот же запрет касается кода сразу после останова внутри одной функции:
fmt.Println("a")
panic("halt")
fmt.Println("b")
Дана функция:
func crash() {
panic("bad")
}
В main выведите "go", вызовите
crash и выведите "stop".
Скажите, какие из этих двух строк появятся
на экране.
Дан следующий код:
package main
import "fmt"
func chain() {
middle()
}
func middle() {
panic("deep")
}
func main() {
chain()
fmt.Println("ok")
}
Скажите, выполнится ли печать "ok"
в main после вызова chain.
Скажите, что должно стоять в main,
чтобы после сбоя в fail из примера
урока все же напечатать "after".