ホームページ >バックエンド開発 >Golang >Go で Is() と As() を使用して再帰的エラー ラッピングを実現するにはどうすればよいですか?

Go で Is() と As() を使用して再帰的エラー ラッピングを実現するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 10:42:11300ブラウズ

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

Go エラー: Is() と As() は再帰的エラー ラッピングをサポート

Go では、エラーの管理と分析にはエラー処理が重要ですアプリケーション全体を通して。エラー インターフェイスはエラーを表す一般的な方法を提供し、エラー イントロスペクションのための Is() や As() などのメソッドが含まれています。

ただし、標準のエラー インターフェイスは再帰的エラー ラッピングをサポートしていないことに注意することが重要です。 。つまり、fmt.Errorf を使用してエラーをラップすると、Is() と As() を使用して根本的なエラーを再帰的にチェックできなくなります。

再帰的エラーのカスタム エラー タイプWrapping

再帰的なエラー ラッピングを実現するには、エラー インターフェイスを実装するカスタム エラー タイプを作成できます。この型には、ラップされたエラーへの参照を含め、再帰的な比較を有効にするカスタム 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
}

Usage

このカスタム エラー タイプを使用して、エラーをラップしてチェックできるようになりました。 Is() と As() を使用して根本的なエラーを再帰的に検出します。例:

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() メソッドを使用してカスタム エラー タイプを作成することで、再帰的エラーのラッピングを実現し、 Go アプリケーションでのエラー処理がより正確になります。

以上がGo で Is() と As() を使用して再帰的エラー ラッピングを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。