首頁  >  文章  >  後端開發  >  為什麼 Go 中的巢狀延遲函數中 `recover()` 回傳 `nil`?

為什麼 Go 中的巢狀延遲函數中 `recover()` 回傳 `nil`?

Patricia Arquette
Patricia Arquette原創
2024-11-24 06:56:09907瀏覽

Why Does `recover()` Return `nil` in Nested Deferred Functions in Go?

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

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