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

Неперехваченный останов в 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".

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