Go
Paniek en herstellen
Zoeken…
Opmerkingen
Dit artikel veronderstelt kennis van Defer Basics
Lees voor normale foutafhandeling het onderwerp over foutafhandeling
Paniek
Een paniek stopt de normale uitvoeringsstroom en verlaat de huidige functie. Uitgestelde oproepen worden vervolgens uitgevoerd voordat de besturing wordt doorgegeven aan de volgende hogere functie op de stapel. De functie van elke stapel wordt afgesloten en uitgestelde oproepen uitgevoerd totdat de paniek wordt afgehandeld met een uitgestelde recover()
, of totdat de paniek main()
en het programma beëindigt. Als dit gebeurt, wordt het argument voor paniek en een stacktracering afgedrukt naar stderr
.
package main
import "fmt"
func foo() {
defer fmt.Println("Exiting foo")
panic("bar")
}
func main() {
defer fmt.Println("Exiting main")
foo()
}
Output:
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
Het is belangrijk op te merken dat panic
elk type als parameter accepteert.
Herstellen
Herstel zoals de naam al aangeeft, kan proberen te herstellen van panic
. Het herstel moet worden geprobeerd in een uitgestelde verklaring omdat de normale uitvoeringsstroom is gestopt. De recover
moet rechtstreeks in de uitgestelde functiebijlage worden weergegeven. Herstel verklaringen in functies die worden aangeroepen door uitgestelde functie-oproepen, worden niet gehonoreerd. De aanroep recover()
retourneert het opgegeven argument naar de initiële paniek, als het programma momenteel in paniek is. Als het programma momenteel niet in paniek raakt, zal recover()
nil
opleveren.
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")
}
Output:
Entering main
Recovered with message bar
Exiting main the normal way