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

使用型別斷言進行錯誤處理是錯誤的嗎?

WBOY
發布: 2024-02-10 10:24:09
轉載
895 人瀏覽過

使用型別斷言進行錯誤處理是錯誤的嗎?

使用類型斷言進行錯誤處理是一種常見的做法,但是否錯誤取決於具體情況。類型斷言可以用於驗證傳入的參數類型是否符合預期,從而在程式碼中提前捕獲錯誤。然而,如果錯誤處理依賴於類型斷言而忽略了其他可能的異常情況,則可能會導致問題。因此,在使用類型斷言進行錯誤處理時,需要綜合考慮程式碼的邏輯和可靠性,並確保對各種異常情況進行適當處理,以確保程式碼的穩定性和可維護性。

問題內容

我想知道為什麼在 golang 中不更多地使用/推薦 switch 類型斷言風格的錯誤處理。它有什麼問題嗎?還是社區根本不關心它?

例如下面的程式碼:

if err != nil {
    if errors.as(err, &queryerr{}) {
        log.println("query error : ", err)
        return http.statusinternalservererror
    } else if errors.as(err, &querydataextractionerr{}) {
        return http.statusnotfound
    } else {
        log.println(err.error())
        return http.statusinternalservererror
    }
}
登入後複製

可以寫成:

if err != nil {
    switch err.(type) {
    case QueryErr:
        log.Println("query error : ", err)
        return http.StatusInternalServerError
    case QueryDataExtractionErr:
        return http.StatusNotFound
    default:
        log.Println(err.Error())
        return http.StatusInternalServerError
    }
}
登入後複製

解決方法

類型開關在技術上是正確的。然而,有錯誤的類型切換會誤解包裝的錯誤。例如:

err:=io.EOF
err1 := fmt.Errorf("Unexpected error: %w",err)
登入後複製

在上面,err1.(io.eof) 會失敗,但 errors.is(err1,io.eof) 不會。

因此,您應該使用 errors.iserrors.as 來測試您手邊的錯誤是否包含您正在尋找的錯誤。

以上是使用型別斷言進行錯誤處理是錯誤的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!