首頁 >後端開發 >Golang >Go 的 `errors.Is` 和 `errors.As` 支援遞歸錯誤包裝嗎?

Go 的 `errors.Is` 和 `errors.As` 支援遞歸錯誤包裝嗎?

Patricia Arquette
Patricia Arquette原創
2024-12-14 19:23:10536瀏覽

Does Go's `errors.Is` and `errors.As` Support Recursive Error Wrapping?

Go 中的遞歸錯誤包裝

Go 的錯誤處理機制提供了Is() 和As() 等方法來進行錯誤檢查。然而,通常假設這些方法支援遞歸錯誤包裝。這並不完全正確。

將 fmt.Errorf 與 %w 動詞一起使用僅允許淺層錯誤包裝。要實現真正的遞歸,需要自訂錯誤類型。

通常,自訂錯誤類型將包含指向已包裝錯誤的指標以及解包它的方法。然而,簡單地以這種方式包裝錯誤會帶來問題。如果多個包裝錯誤共用同一個指針,則錯誤比較將失敗,因為 Go 錯誤是按地址進行比較的。

解決方案是在自訂錯誤類型中實作 Is() 和 As() 方法。這些方法應該比較嵌入的錯誤而不是自訂類型本身,從而允許完全遞歸錯誤包裝而無需基於地址的問題。

例如,以下是支援遞歸包裝的錯誤類型的簡化版本:

type errorChain struct {
    err  error
    next *errorChain
}

func (c errorChain) Is(err error) bool { return errors.Is(c.err, err) }
func (c errorChain) As(target any) bool { return errors.As(c.err, target) }
func (c errorChain) Unwrap() error  { return c.next }

此錯誤類型可用於根據需要包裝錯誤,從而允許使用Is() 和As() 進行完整的錯誤檢查。

以上是Go 的 `errors.Is` 和 `errors.As` 支援遞歸錯誤包裝嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn