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