Recover()在巢狀延遲函數中的行為
在Go中,panic()和recover()用於處理運行時錯誤。但是,可恢復的錯誤必須由延遲函數處理。
簡單案例:
在簡單的延遲函數場景中,recover() 按預期運行:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") }
嵌套延遲案例:
當printRecover()包裝在巢狀延遲函數中時:
func main() { defer func() { printRecover() }() panic("OMG!") }
行為改變。 printRecover() 中的recover() 傳回 nil。這是因為:
根據Go規範:
如果recover()不是由延遲函數直接調用,則recover()的回傳值為nil。
在嵌套情況下, printRecover() 由嵌套延遲函數調用,而不是直接由初始函數調用一.
結論:
為了讓recover()在巢狀的延遲函數中運作,它必須由處理panic的延遲函數直接呼叫。當不滿足這個條件時,recover()將會傳回nil。
以上是為什麼 Go 中的巢狀延遲函數中 `recover()` 回傳 `nil`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!