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 サイトの他の関連記事を参照してください。