Go
Panika i odzyskiwanie
Szukaj…
Uwagi
Ten artykuł zakłada znajomość Podstaw Defer
Aby zapoznać się ze zwykłą obsługą błędów, przeczytaj temat dotyczący obsługi błędów
Panika
Panika zatrzymuje normalny przepływ wykonania i wychodzi z bieżącej funkcji. Wszelkie odroczone wywołania będą wówczas wykonywane, zanim kontrola zostanie przekazana do następnej wyższej funkcji na stosie. Funkcja każdego stosu kończy działanie i uruchamia odroczone wywołania, dopóki panika nie zostanie obsłużona za pomocą odroczonego odtwarzania recover()
lub dopóki panika nie osiągnie main()
i zakończy działanie programu. Jeśli tak się stanie, argument przekazany do paniki i ślad stosu zostaną wydrukowane na stderr
.
package main
import "fmt"
func foo() {
defer fmt.Println("Exiting foo")
panic("bar")
}
func main() {
defer fmt.Println("Exiting main")
foo()
}
Wynik:
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
Ważne jest, aby pamiętać, że panic
zaakceptuje każdy typ jako swój parametr.
Wyzdrowieć
Odzyskiwanie, jak sama nazwa wskazuje, może próbować wyleczyć się z panic
. Należy podjąć próbę odzyskania w odroczonej instrukcji, ponieważ normalny przepływ wykonania został zatrzymany. recover
oświadczenie musi pojawić się bezpośrednio w obudowie odroczonego funkcji. Odzyskiwanie instrukcji w funkcjach wywoływanych przez odroczone wywołania funkcji nie będzie honorowane. Wywołanie recover()
zwróci podany argument do początkowej paniki, jeśli program aktualnie panikuje. Jeśli program aktualnie nie panikuje, funkcja return recover()
zwróci 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")
}
Wynik:
Entering main
Recovered with message bar
Exiting main the normal way