首頁 > 後端開發 > Golang > Go中如何使用Is()和As()實作遞歸錯誤包裝?

Go中如何使用Is()和As()實作遞歸錯誤包裝?

Barbara Streisand
發布: 2024-12-11 10:42:11
原創
297 人瀏覽過

How Can I Achieve Recursive Error Wrapping with Is() and As() in Go?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板