Heim > Backend-Entwicklung > Golang > Defer „recover()' vs. „defer func() { restart() }()': Warum erholt sich der eine von Panics und der andere nicht?

Defer „recover()' vs. „defer func() { restart() }()': Warum erholt sich der eine von Panics und der andere nicht?

DDD
Freigeben: 2024-11-29 11:27:10
Original
969 Leute haben es durchsucht

Defer `recover()` vs. `defer func() { recover() }()`: Why Does One Recover Panics and the Other Doesn't?

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")
}
Nach dem Login kopieren

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!

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