首頁 >後端開發 >Golang >使用型別斷言進行錯誤處理是錯誤的嗎?

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

WBOY
WBOY轉載
2024-02-10 10:24:09925瀏覽

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

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

問題內容

我想知道為什麼在 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刪除