Defer Recover() vs. Defer Func() { Recover() }()
F: Warum funktioniert ein Aufruf zum Defer Func () { restart() }() hat eine in Panik geratene Goroutine erfolgreich wiederhergestellt, während ein Aufruf zum Aufschieben von „recover()“ dies nicht tut?
A: Wie in der offiziellen Dokumentation für angegeben „recover()“:
„Wenn „recover“ außerhalb der verzögerten Funktion aufgerufen wird, wird eine in Panik geratene Sequenz nicht gestoppt.“
Im Fall von defer „recover()“ ist „recover()“ die verzögerte Funktion selbst. Bei der Ausführung ruft sich „recover()“ nicht selbst auf. Daher kann die Paniksequenz nicht gestoppt werden.
Wenn sich „recover()“ selbst aufrufen könnte, würde es die Panik stoppen. Dieses Szenario ist jedoch nicht realisierbar.
Zusätzliche Überlegungen:
Der folgende Code vermeidet auch Panik:
package main func main() { var recover = func() { recover() } defer recover() panic("panic") }
In diesem Fall a Die Variable „recover“ vom Funktionstyp wird erstellt, um eine anonyme Funktion zu speichern, die die integrierte Funktion „recover()“ aufruft. Die verzögerte Funktion wird dann so eingestellt, dass sie den Wert der Wiederherstellungsvariablen aufruft. Dadurch wird die Paniksequenz erfolgreich gestoppt, indem indirekt die Funktion „recover()“ aufgerufen wird.
Das obige ist der detaillierte Inhalt vonDefer „recover()' vs. „defer func() { restart() }()': Warum erholt sich der eine von Panics und der andere nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!