首頁  >  文章  >  後端開發  >  為什麼 Go 中用於錯誤處理的 defer 函數中的 return nil, err 不正確?

為什麼 Go 中用於錯誤處理的 defer 函數中的 return nil, err 不正確?

Linda Hamilton
Linda Hamilton原創
2024-11-14 12:10:02199瀏覽

Why is `return nil, err` incorrect in a `defer` function used for error handling in Go?

Go:使用 Defer 處理 Panics

Go 中的 Panic 和 defer 提供了一種優雅地處理錯誤和清理資源的機制。但是,使用 defer 和 panic 進行錯誤處理需要澄清。

考慮以下程式碼:

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err // Code 1
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function, which can try to out-of-bound-access a slice
    ...
}

這裡的目的是在函數發生恐慌時回傳錯誤。然而,defer函數使用return nil, err(標記為代碼1)從目前函數返回。這不是正確的做法。

在 defer 函數中,您可以修改傳回的參數,但不能傳回一組新的值。若要解決此問題,請將代碼 1 替換為:

rep = nil
err = errors.New(r.(string))
return

這會正確設定錯誤並使報告無效。

此外,需要注意的是,recover() 傳回的 r 值是類型為介面{}。在上面的程式碼中,它被類型斷言為錯誤。如果panic值不是錯誤,則應使用更合適的類型斷言或將其作為未知panic處理。

以上是為什麼 Go 中用於錯誤處理的 defer 函數中的 return nil, err 不正確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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