
使用類型斷言進行錯誤處理是一種常見的做法,但是否錯誤取決於具體情況。類型斷言可以用於驗證傳入的參數類型是否符合預期,從而在程式碼中提前捕獲錯誤。然而,如果錯誤處理依賴於類型斷言而忽略了其他可能的異常情況,則可能會導致問題。因此,在使用類型斷言進行錯誤處理時,需要綜合考慮程式碼的邏輯和可靠性,並確保對各種異常情況進行適當處理,以確保程式碼的穩定性和可維護性。
問題內容
我想知道為什麼在 golang 中不更多地使用/推薦 switch 類型斷言風格的錯誤處理。它有什麼問題嗎?還是社區根本不關心它?
例如下面的程式碼:
1 2 3 4 5 6 7 8 9 10 11 | 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
}
}
|
登入後複製
可以寫成:
1 2 3 4 5 6 7 8 9 10 11 12 | 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
}
}
|
登入後複製
解決方法
類型開關在技術上是正確的。然而,有錯誤的類型切換會誤解包裝的錯誤。例如:
1 2 | err:=io.EOF
err1 := fmt.Errorf( "Unexpected error: %w" ,err)
|
登入後複製
在上面,err1.(io.eof)
會失敗,但 errors.is(err1,io.eof)
不會。
因此,您應該使用 errors.is
和 errors.as
來測試您手邊的錯誤是否包含您正在尋找的錯誤。
以上是使用型別斷言進行錯誤處理是錯誤的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!