Heim >Backend-Entwicklung >Golang >Warum kann „defer restart()' Panics in Go manchmal nicht wiederherstellen?
Verstehen der Einschränkungen von „Defer Recover()“
In Go kann die Verwendung des Musters „Defer Recover()“ Paniken abfangen und die Programmbeendigung verhindern. Wie im Beispiel gezeigt, kann ein direkter Aufruf von defer restart() jedoch nicht nach einer Panik wiederhergestellt werden. Dieses Verhalten hängt von der spezifischen Implementierung von „recover()“ ab.
Der offiziellen Dokumentation zufolge unterdrückt „recover()“ Paniken nur, wenn es innerhalb einer verzögerten Funktion aufgerufen wird. Beim direkten Aufruf kann die Programmbeendigung nicht verhindert werden. Diese Unterscheidung ergibt sich aus der Tatsache, dass die verzögerte Funktion im Fall von defer restart() der Recover()-Aufruf selbst ist.
Um dies zu veranschaulichen, betrachten Sie das folgende Beispiel:
package main func main() { defer func() { recover() }() // Recoverable panic panic("panic") }
In diesem Szenario dient die anonyme Funktion als verzögerte Funktion und der darin enthaltene Aufruf „recover()“ fängt die Panik erfolgreich ab.
Im Folgenden jedoch Code:
package main func main() { defer recover() // Direct call to recover() panic("panic") }
recover() wird direkt als verzögerte Funktion aufgerufen, was dazu führt, dass das Programm in Panik gerät, anstatt sich zu erholen.
Eine interessante Variation
Eine interessante Variante, die es zu berücksichtigen gilt, ist der folgende Code, der keine Panik auslöst:
package main func main() { var recover = func() { recover() } // Function type variable defer recover() panic("panic") }
In diesem Beispiel haben wir Weisen Sie einer Variablen namens „recover“ eine anonyme Funktion zu. Diese Funktion ruft die integrierte Funktion „recover()“ auf. Die verzögerte Funktion wird dann so eingestellt, dass sie den Wert der Wiederherstellungsvariablen aufruft, also tatsächlich „recover()“ aufruft. Dadurch wird die Panik abgefangen und das Programm setzt die Ausführung fort.
Das obige ist der detaillierte Inhalt vonWarum kann „defer restart()' Panics in Go manchmal nicht wiederherstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!