Go
Паника и восстановление
Поиск…
замечания
Эта статья предполагает знание основ Defer
Для обычной обработки ошибок прочитайте раздел об обработке ошибок
паника
Паника останавливает нормальный поток выполнения и выходит из текущей функции. Любые отложенные вызовы будут выполняться до того, как управление будет передано следующей более высокой функции в стеке. Функция каждого стека будет выходить и запускать отложенные вызовы до тех пор, пока паника не будет обработана с использованием отложенного recover()
, или пока паника не достигнет main()
и не завершит программу. Если это произойдет, аргумент, предоставленный панике, и трассировка стека будут напечатаны на stderr
.
package main
import "fmt"
func foo() {
defer fmt.Println("Exiting foo")
panic("bar")
}
func main() {
defer fmt.Println("Exiting main")
foo()
}
Выход:
Exiting foo
Exiting main
panic: bar
goroutine 1 [running]:
panic(0x128360, 0x1040a130)
/usr/local/go/src/runtime/panic.go:481 +0x700
main.foo()
/tmp/sandbox550159908/main.go:7 +0x160
main.main()
/tmp/sandbox550159908/main.go:12 +0x120
Важно отметить, что panic
будет принимать любой тип в качестве параметра.
оправляться
Восстановление, как следует из названия, может попытаться восстановиться после panic
. Восстановление должно быть предпринято в отложенном заявлении, поскольку нормальный поток выполнения был остановлен. Оператор recover
должен отображаться непосредственно в оболочке отложенной функции. Восстановление заявлений в функциях, вызванных отложенными вызовами функций, не будет выполнено. Вызов recover()
возвращает аргумент, предоставленный для начальной паники, если программа в настоящее время впадает в панику. Если программа в настоящее время не паникует, recover()
вернет nil
.
package main
import "fmt"
func foo() {
panic("bar")
}
func bar() {
defer func() {
if msg := recover(); msg != nil {
fmt.Printf("Recovered with message %s\n", msg)
}
}()
foo()
fmt.Println("Never gets executed")
}
func main() {
fmt.Println("Entering main")
bar()
fmt.Println("Exiting main the normal way")
}
Выход:
Entering main
Recovered with message bar
Exiting main the normal way