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