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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow