使用 Defer 運算傳回值
在 Go 中,defer 語句可用於在周圍函數傳回後執行函數。即使發生錯誤,此機制也允許您處理清理任務或執行操作。但是,當嘗試從發生緊急情況並包含在 defer 語句中的函數傳回錯誤值時,就會出現限制。
考慮以下程式碼片段:
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 } }() panic("Report format not recognized.") // Remaining function code... }
意圖是如果 getReport 函數出現緊急情況,則傳回錯誤。但是,這種方法不起作用,因為延遲函數無法更改周圍函數中返回值的數量。相反,它們只能修改現有返回參數的值。
要解決此問題,defer 函數應該修改err 傳回參數,而不是嘗試傳回新的錯誤值:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // Find out the exact error type and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // Invalidate rep rep = nil } }()
透過此修改,defer 函數會更新err 傳回參數並將rep 設定為nil 以指示錯誤情況。這允許周圍的函數傳回修改後的錯誤值。
以上是Defer 語句可以用來操作恐慌函數中的回傳值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!