Heim >Backend-Entwicklung >Golang >Wie unterscheidet sich das Verhalten von „recover()' bei verschachtelten und nicht verschachtelten verzögerten Funktionen in Go?

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

Susan Sarandon
Susan SarandonOriginal
2024-11-23 04:24:161082Durchsuche

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
}

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!

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
}

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

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!

Stellungnahme:
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