為什麼在巢狀延遲函數中recover()失敗
Golang的panic/recover機制提供了一種在運行時處理意外錯誤的方法。在一個簡單的程序中,如果按預期使用panic()和recover(),行為很簡單:引發恐慌,並且延遲的recover()函數捕獲它。
但是,當recovery() 函數嵌套在另一個延遲函數中。在這種情況下,recover() 傳回 nil,從而允許恐慌在程式中傳播。
理解機制
這種行為的原因在於設計Golang的延遲函數機制。當執行延遲函數時,它會捕獲當前 goroutine 的狀態,其中包括變數和呼叫者函數。如果延遲函數呼叫另一個延遲函數(如巢狀的recover()的情況),則不會擷取內部延遲函數的狀態。
當直接從延遲函數呼叫recover()時,它從 goroutine 的狀態中尋找捕獲的恐慌值。然而,當從嵌套的延遲函數中呼叫recover()時,它無法存取捕獲的恐慌值,從而導致返回nil。
結論
為了有效地從恐慌中恢復,必須直接從延遲函數呼叫recover()。在recover()周圍嵌套延遲函數將無法按預期工作,並可能導致意外的恐慌傳播。
以上是為什麼 Go 中的巢狀延遲函數 `recover()` 會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!