首頁  >  文章  >  後端開發  >  呼叫者函數可以從子 Goroutine 恐慌中恢復嗎?

呼叫者函數可以從子 Goroutine 恐慌中恢復嗎?

Susan Sarandon
Susan Sarandon原創
2024-11-04 08:21:30703瀏覽

Can a Caller Function Recover from a Child Goroutine Panic?

從子 Goroutine 恐慌中恢復呼叫函數

與普遍看法相反,goroutine 的恐慌並不一定會終止整個程式。這種誤解源自於這樣的假設:呼叫者中的延遲恢復函數將處理恐慌。然而,如果呼叫者在 goroutine 中發生恐慌之前完成,則情況並非如此。

考慮以下範例:

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

儘管呼叫者函數 (fun1) 完成執行,但如果 fun2 出現恐慌,程式仍會終止。發生這種情況是因為 Go 規範定義了當 Goroutine 中發生恐慌時:

  • 該 Goroutine 的執行終止。
  • 該 Goroutine 呼叫的延遲函數執行。
  • 呼叫者的延遲函數執行。

在這種情況下,fun2 是 goroutine 中的頂級函數,它不會從恐慌中恢復。因此,程序終止。

關鍵點是:

一個 Goroutine 無法從另一個 Goroutine 發生的 Panic 中恢復。

以上是呼叫者函數可以從子 Goroutine 恐慌中恢復嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn