ホームページ >バックエンド開発 >Golang >Go の `errors.Is` と `errors.As` は再帰的エラー ラッピングをサポートしていますか?

Go の `errors.Is` と `errors.As` は再帰的エラー ラッピングをサポートしていますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-14 19:23:10536ブラウズ

Does Go's `errors.Is` and `errors.As` Support Recursive Error Wrapping?

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

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