Wie unterscheidet sich das Verhalten von „recover()' bei verschachtelten und nicht verschachtelten verzögerten Funktionen in Go?

Susan Sarandon
Freigeben: 2024-11-23 04:24:16
Original
998 Leute haben es durchsucht

How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?

Recover()-Einschränkungen in verschachtelten verzögerten Funktionen verstehen

In Golang stellen Panic und Recovery Mechanismen für die Fehlerbehandlung und -wiederherstellung bereit. Während „recover()“ bei der Bewältigung von Panikattacken hilft, indem es den Panikwert zurückgibt, ändert sich sein Verhalten innerhalb verschachtelter verzögerter Funktionen.

Beispiel 1: Einfache verzögerte Funktion

Bedenken Sie den folgenden Codeausschnitt :

package main

import "fmt"

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

func main() {
    defer printRecover()

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

Dieser Code gerät in Panik mit „OMG!“ und stellt den Panikwert mithilfe der verzögerten Funktion printRecover() erfolgreich wieder her, wie aus der Ausgabe hervorgeht:

Recovered: OMG!
Nach dem Login kopieren

Beispiel 2: Verschachtelte verzögerte Funktion

Nun lasst uns Wickeln Sie printRecover() in eine andere verzögerte Funktion ein:

package main

import "fmt"

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

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

    panic("OMG!") // Panic goes unrecoverable
}
Nach dem Login kopieren

In diesem Beispiel verschwindet die Panik nicht wiederherstellbar, und das Programm gerät mit der Meldung in Panik:

Recovered: <nil>
panic: OMG!

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

Den Unterschied verstehen

Der Unterschied zwischen diesen beiden Beispielen liegt in der Art und Weise, wie „recover()“ aufgerufen wird. Gemäß der Golang-Spezifikation:

  • recover() gibt Null zurück, wenn es nicht direkt von einer verzögerten Funktion aufgerufen wird.

In Beispiel 1 wird printRecover() direkt von a aufgerufen verzögerte Funktion, die es ihr ermöglicht, den Panikwert zurückzugeben. In Beispiel 2 wird printRecover() jedoch von einer anonymen Funktion aufgerufen, die dann zurückgestellt wird. Dies führt dazu, dass „recover()“ Null zurückgibt, da es nicht direkt von einer verzögerten Funktion aufgerufen wird.

Um eine Panik innerhalb einer verschachtelten verzögerten Funktion erfolgreich zu beheben, muss daher „recover()“ direkt von einer verzögerten Funktion aufgerufen werden.

Das obige ist der detaillierte Inhalt vonWie unterscheidet sich das Verhalten von „recover()' bei verschachtelten und nicht 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage