Go 錯誤:Is() 和As() 支援遞歸錯誤包裝
在Go 中,錯誤處理對於管理和分析錯誤至關重要整個申請過程中。錯誤介面提供了一種通用的方式來表示錯誤,它包括 Is() 和 As() 等用於錯誤自省的方法。
但是要注意的是,標準錯誤介面不支援遞迴錯誤包裝。這意味著,如果您使用 fmt.Errorf 來包裝錯誤,您將無法使用 Is() 和 As() 遞歸地檢查底層錯誤。
遞歸錯誤的自訂錯誤類型包裝
要實作遞歸錯誤包裝,您可以建立一個實作錯誤介面的自訂錯誤類型。此類型應包含對包裝錯誤的引用,並定義自訂 Is() 和 As() 方法以啟用遞歸比較。
以下是遞迴錯誤類型的範例實作:
type errorChain struct { err error next *errorChain } func (c errorChain) Is(err error) bool { // Check the current error against the given error if c.err == err { return true } // Check if there is a wrapped error and recursively call Is() if c.next != nil { return c.next.Is(err) } return false } func (c errorChain) As(target interface{}) bool { // Check if the current error As() to the target interface if errors.As(c.err, target) { return true } // Check if there is a wrapped error and recursively call As() if c.next != nil { return c.next.As(target) } return false }
遞歸地包裝錯誤
定義自訂錯誤後類型,您可以使用以下函數遞歸地包裝錯誤:
func Wrap(errs ...error) error { if len(errs) == 0 { return nil } // Create the first error in the chain out := &errorChain{err: errs[0]} // Iterate over the remaining errors for _, err := range errs[1:] { // Link the errors together out.next = &errorChain{err: err} out = out.next } return out }
用法用法
用法var Err1 = errors.New("error 1") var Err2 = errors.New("error 2") var Err3 = errors.New("error 3") err := Wrap(Err1, Err2, Err3) fmt.Println(errors.Is(err, Err2)) // true fmt.Println(errors.Is(err, Err3)) // true fmt.Println(errors.Is(err, Err0)) // false
用法
用法用法用法用法用法用法用法用法用法用法用法用法使用您現在可以使用此自訂錯誤類型來包裝錯誤並檢查使用Is() 和As()遞歸地產生潛在錯誤。例如:結論透過使用遞歸Is() 和As() 方法建立自訂錯誤類型,可以實現遞歸錯誤包裝並執行Go 應用程式中更精確的錯誤處理。以上是Go中如何使用Is()和As()實作遞歸錯誤包裝?的詳細內容。更多資訊請關注PHP中文網其他相關文章!