Heim > Backend-Entwicklung > Golang > Warum kann „defer restart()' Panics in Go manchmal nicht wiederherstellen?

Warum kann „defer restart()' Panics in Go manchmal nicht wiederherstellen?

Barbara Streisand
Freigeben: 2024-12-02 17:16:11
Original
240 Leute haben es durchsucht

Why Does `defer recover()` Sometimes Fail to Recover Panics in Go?

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")
}
Nach dem Login kopieren

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")
}
Nach dem Login kopieren

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")
}
Nach dem Login kopieren

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!

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