」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如果 Go 函數發生緊急情況,如何回傳錯誤?

如果 Go 函數發生緊急情況,如何回傳錯誤?

發佈於2024-11-18
瀏覽:148

How to Return an Error if a Go Function Panics?

從Go 中的Defer 返回

您遇到了這樣的問題:如果Go 中的函數發生緊急情況,您希望返回錯誤。這是對您的程式碼的分析和修復:

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)
            switch x := r.(type) {
            case string:
                err = errors.New(x)
            case error:
                err = x
            default:
                err = errors.New("Unknown panic")
            }
            rep = nil // Invalidate rep
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function...
}

Panic 和 Defer 的概念

  • Panic: Panic 表示運行時錯誤,可以透過在defer 函數。
  • Defer: defer 語句延遲函數的執行,直到周圍的函數退出。

程式碼中的修改:

  • defer 函數現在使用 switch-case 語句來正確處理復原的值。
  • 如果恢復的值是字串,則使用 errors 將其轉換為錯誤。 New ().
  • rep 變數在遇到錯誤後會失效,以確保它不會傳回任何資料。
  • rep 變數在發生錯誤時傳回 nil,這與您的符合原始函數簽署。

透過這些更改,如果您的 getReport 函數因無效的報告格式而發生恐慌,它將傳回錯誤。錯誤訊息將是緊急值(如果是字串)或指示未知緊急的一般錯誤。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3