首頁 > 後端開發 > Golang > 主體

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

Susan Sarandon
發布: 2024-11-04 08:21:30
原創
702 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!