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中文網其他相關文章!