Heim > Backend-Entwicklung > Golang > Warum funktioniert „recover()' nicht in verschachtelten verzögerten Funktionen in Go?

Warum funktioniert „recover()' nicht in verschachtelten verzögerten Funktionen in Go?

DDD
Freigeben: 2024-11-24 08:42:14
Original
687 Leute haben es durchsucht

Why Doesn't `recover()` Work in Nested Deferred Functions in Go?

Warum Recover() in verschachtelten verzögerten Funktionen fehlschlägt

Bedenken Sie den folgenden Golang-Code:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer printRecover()

    panic("OMG!")
}
Nach dem Login kopieren

Dieses einfache Programm gerät erfolgreich in Panik und stellt sich mit wieder her die folgende Ausgabe:

Recovered: OMG!
Nach dem Login kopieren

Allerdings wird der Code so geändert, dass printRecover() in einen anderen eingeschlossen wird Die verzögerte Funktion führt zu einem anderen Ergebnis:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer func() {
        printRecover()
    }()

    panic("OMG!")
}
Nach dem Login kopieren

In diesem Fall wird die Panik nicht wiederhergestellt, was zum Absturz des Programms führt:

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60
Nach dem Login kopieren

Die Erklärung für dieses Verhalten liegt in der So funktioniert „recover()“ in Golang. Gemäß der Sprachspezifikation:

The return value of recover is nil if any of the following conditions holds:

- panic's argument was nil;
- the goroutine is not panicking;
- recover was not called directly by a deferred function.
Nach dem Login kopieren

Im ersten Beispiel wird „recover()“ direkt von einer verzögerten Funktion aufgerufen, sodass das Panic-Argument erfolgreich abgerufen wird. Im zweiten Beispiel wird „recover()“ jedoch nicht direkt von einer verzögerten Funktion aufgerufen, sondern von einer Funktion, die selbst von einer verzögerten Funktion aufgerufen wurde. Infolgedessen gibt „recover()“ Null zurück und die Panik wird nicht wiederhergestellt.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „recover()' nicht in verschachtelten verzögerten Funktionen in Go?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage