Heim > Backend-Entwicklung > Golang > Warum fängt „Defer Recover()' keine Panik in Go ab?

Warum fängt „Defer Recover()' keine Panik in Go ab?

Linda Hamilton
Freigeben: 2024-12-05 02:08:09
Original
879 Leute haben es durchsucht

Why Doesn't `defer recover()` Catch Panics in Go?

Wann kann defer Recovery() keine Panik abfangen?

In Go werden Verzögerungsfunktionen in umgekehrter Reihenfolge ihrer Deklaration ausgeführt, wenn a Die Funktion kehrt normal zurück oder gerät in Panik. Während defer func() { restart() }() eine Panik effektiv wiederherstellt, gilt das Gleiche nicht für defer restart().

Dieses Verhalten geht auf die Dokumentation von „recover()“ zurück, in der es heißt: „if „Recover“ wird außerhalb der verzögerten Funktion aufgerufen, es wird nicht eine Paniksequenz stoppen.“ Im Fall von defer restart() ist die Wiederherstellung selbst die verzögerte Funktion und ruft sich daher nicht selbst auf.

Beispiel:

Bedenken Sie den folgenden Code:

package main

func main() {
    defer recover()
    panic("panic")
}
Nach dem Login kopieren

Dieser Code löst tatsächlich eine Panik mit der Meldung „Panik: Panik“ aus, was darauf hinweist, dass die Funktion „Defer Recover()“ das nicht verhindert hat Panik.

Arbeitsbeispiel:

Im Gegensatz dazu erholt sich der folgende Code erfolgreich von der Panik:

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}
Nach dem Login kopieren

In diesem Fall der anonyme Die Funktion wird aufgerufen, wenn die Hauptfunktion zurückkehrt oder in Panik gerät. Innerhalb dieser anonymen Funktion wird „recover()“ aufgerufen, wodurch die Panik erfolgreich erfasst und verhindert wird.

Außergewöhnliches Beispiel:

Interessanterweise vermeidet der folgende Code auch die Panik:

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}
Nach dem Login kopieren

Hier enthält die Variable der Wiederherstellungsfunktion einen Verweis auf die anonyme Funktion, die die integrierte Funktion „recover()“ aufruft. Wenn Sie diese Variable als verzögerte Funktion angeben, wird effektiv die integrierte Funktion „recover()“ aufgerufen, wodurch die Panik gestoppt wird.

Das obige ist der detaillierte Inhalt vonWarum fängt „Defer Recover()' keine Panik in Go ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage