Go
Panik och återhämta sig
Sök…
Anmärkningar
Den här artikeln antar kunskaper om grundläggande information om uppskjutningar
För vanlig felhantering, läs ämnet om felhantering
Panik
En panik stoppar det normala exekveringsflödet och lämnar den aktuella funktionen. Eventuella uppskjutna samtal kommer sedan att köras innan kontrollen överförs till nästa högre funktion på stacken. Varje stacks funktion kommer att lämna och köra uppskjutna samtal tills paniken hanteras med ett uppskjuten recover()
, eller tills paniken når main()
och avslutar programmet. Om detta inträffar kommer argumentet som ges för panik och ett stapelspår att skrivas ut till stderr
.
package main
import "fmt"
func foo() {
defer fmt.Println("Exiting foo")
panic("bar")
}
func main() {
defer fmt.Println("Exiting main")
foo()
}
Produktion:
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
Det är viktigt att notera att panic
accepterar alla typer som sin parameter.
Ta igen sig
Återställning som namnet antyder kan försöka återhämta sig från panic
. Återställningen måste försökas i ett uppskjutet uttalande eftersom normalt körningsflöde har stoppats. recover
måste visas direkt i den uppskjutna funktionshöljet. Återställa uttalanden i funktioner som kallas av uppskjutna funktionssamtal kommer inte att respekteras. recover()
-samtalet kommer att returnera argumentet som tillhandahålls till den första paniken, om programmet för närvarande är i panik. Om programmet för närvarande inte är i panik, kommer recover()
att återgå 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")
}
Produktion:
Entering main
Recovered with message bar
Exiting main the normal way