首頁 > 後端開發 > Golang > 如何處理 Go 函數中的恐慌和延遲返回?

如何處理 Go 函數中的恐慌和延遲返回?

DDD
發布: 2024-11-15 05:35:02
原創
430 人瀏覽過

How to Handle Panics and Defer Returns in Go Functions?

Go 中延遲回傳

在 Go 中,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.")
    // rest of the getReport function
}
登入後複製

但是,此程式碼無法如預期運作。 deferred函數內的return語句只是修改了函數內的局部變數err和rep,並沒有真正將它們傳回函數外。

為了解決這個問題,我們可以使用deferred函數內的recover函數來檢索恐慌值並相應地設定 err 參數。此外,我們應該檢查恐慌值的類型,並在必要時將其轉換為錯誤。

這是更新的程式碼:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        rep = nil
    }
}()
登入後複製

此程式碼確保err 參數設定為基於恐慌值的適當錯誤,而且它還會使rep參數無效以防止傳回不完整的報告。

以上是如何處理 Go 函數中的恐慌和延遲返回?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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