Suche…


Bemerkungen

Dieser Artikel setzt Kenntnisse über Defer-Grundlagen voraus

Lesen Sie für die normale Fehlerbehandlung das Thema zur Fehlerbehandlung

Panik

Eine Panik stoppt den normalen Ausführungsablauf und verlässt die aktuelle Funktion. Alle zurückgestellten Aufrufe werden dann ausgeführt, bevor die Steuerung an die nächst höhere Funktion des Stapels übergeben wird. Die Funktion jedes Stacks wird beendet und verzögerte Aufrufe ausgeführt, bis die Panik mit einem verzögerten recover() wird oder bis die Panik main() und das Programm beendet. In diesem Fall werden das zur Panik bereitgestellte Argument und eine Stapelablaufverfolgung an stderr .

package main

import "fmt"

func foo() {
    defer fmt.Println("Exiting foo")
    panic("bar")
}

func main() {
    defer fmt.Println("Exiting main")
    foo()
}

Ausgabe:

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

Es ist wichtig zu wissen, dass die panic jeden Typ als Parameter akzeptiert.

Genesen

Wiederherstellen, wie der Name schon sagt, können versuchen, sich von einer panic zu erholen. Die Wiederherstellung muss in einer aufgeschobenen Anweisung versucht werden, da der normale Ausführungsablauf angehalten wurde. Die recover muss direkt im Gehäuse der verzögerten Funktion angezeigt werden. Anweisungen zum Wiederherstellen von Funktionen, die von zurückgestellten Funktionsaufrufen aufgerufen werden, werden nicht berücksichtigt. Der Aufruf von recover() gibt das angegebene Argument an die ursprüngliche Panik zurück, wenn das Programm gerade in Panik gerät. Wenn das Programm momentan nicht in Panik gerät, wird " 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")
}

Ausgabe:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow