Heim >Backend-Entwicklung >Golang >Kann sich eine Caller-Funktion von der Panik einer untergeordneten Goroutine in Go erholen?

Kann sich eine Caller-Funktion von der Panik einer untergeordneten Goroutine in Go erholen?

Linda Hamilton
Linda HamiltonOriginal
2024-10-28 18:10:021001Durchsuche

Can a Caller Function Recover from a Child Goroutine's Panic in Go?

Wie erholt sich eine Caller-Funktion von der Panik einer untergeordneten Goroutine?

Bisher ging man davon aus, dass eine Panik in einer Goroutine das Programm beenden würde wenn der Anrufer fertig war, bevor die Panik auftrat. Das Experimentieren mit einem Beispielcode ergab jedoch etwas anderes.

Beispielcode:

<code class="go">func fun1() {
    fmt.Println("fun1 started")
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recover in func1")
        }
    }()

    go fun2()

    time.Sleep(10 * time.Second) // wait for the boom!
    fmt.Println("fun1 ended")
}

func fun2() {
    fmt.Println("fun2 started")

    time.Sleep(5 * time.Second)
    panic("fun2 booom!")

    fmt.Println("fun2 ended")
}</code>

Unerwartetes Verhalten:

Trotz In der Erwartung, dass der Wiederherstellungsmechanismus der Aufruferfunktion die Panik der Goroutine bewältigen würde, wurde das gesamte Programm dennoch beendet.

Erklärung:

Die Go-Spezifikation besagt Folgendes:

Wenn fun2 die Funktion der obersten Ebene ist, die in der Goroutine ausgeführt wird, und fun2 sich nicht von einer Panik erholt, wird das Programm beendet, wenn fun2 in Panik gerät.

Da fun2 die Funktion der obersten Ebene in seiner Goroutine ist, und das tut sie auch Wenn Sie die Panik nicht bewältigen, wird das Programm vorzeitig beendet.

Goroutine-Autonomie:

Eine Goroutine kann sich nicht von einer Panik in einer anderen Goroutine erholen. Daher wird der verzögerte Aufruf in fun1 nicht aufgerufen, wenn fun2 in Panik gerät.

Schlussfolgerung:

Eine Aufruferfunktion kann sich von Paniken in Goroutinen, die sie erstellt, nicht erholen, es sei denn, die Goroutine wird explizit wiederhergestellt aus der Panik, bevor der Programmaufrufer beendet wird.

Das obige ist der detaillierte Inhalt vonKann sich eine Caller-Funktion von der Panik einer untergeordneten Goroutine in Go erholen?. 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