從子 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 中發生恐慌時:
在這種情況下,fun2 是 goroutine 中的頂級函數,它不會從恐慌中恢復。因此,程序終止。
關鍵點是:
一個 Goroutine 無法從另一個 Goroutine 發生的 Panic 中恢復。
以上是呼叫者函數可以從子 Goroutine 恐慌中恢復嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!