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") }
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") }
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") }
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!