首頁 > 後端開發 > Golang > 主體

Defer 語句可以用來操作恐慌函數中的回傳值嗎?

Mary-Kate Olsen
發布: 2024-11-12 17:18:01
原創
816 人瀏覽過

Can Defer Statements Be Used to Manipulate Return Values in Panicked Functions?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板