ホームページ >バックエンド開発 >Golang >多層 Go 抽象化でエラー伝播を効果的に処理するにはどうすればよいですか?

多層 Go 抽象化でエラー伝播を効果的に処理するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-12 18:21:11675ブラウズ

How Can I Effectively Handle Error Propagation in Multi-Layer Go Abstractions?

多層抽象化でのエラー伝播

Go では、複数の抽象レベルにわたるエラー処理が課題になることがあります。エラーを継続的に上方に渡します。これにより、ログ メッセージが重複したり、コンテキスト情報が失われることがよくあります。

推奨される解決策: エラーの注釈

エラー処理の推奨方法は、エラーをそのまま注釈として付けることです。さまざまな抽象化レベルを通過します。これにより、元のエラーのコンテキストを保持しながら、各レベルで追加情報を追加できます。

「github.com/pkg/errors」のようなライブラリを使用すると、エラー処理を次のように実装できます。次のとおりです:

// Wraps the original error with additional context.
func (o *ObjectOne) CheckValue() error {
    if o.someValue == 0 {
        return errors.New("Object1 illegal state: value is 0")
    }
    return nil
}

// Annotates the original error with context.
func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error {
    if err := oT.objectOne.CheckValue(); err != nil {
        return errors.Wrap(err, "Object2 illegal state: Object1 is invalid")
    }
    return nil
}

// Preserves the annotated error stack.
func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error {
    if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil {
        return errors.Wrap(err, "Object3 illegal state: Object2 is invalid")
    }
    return nil
}

使用法:

o3 := &ObjectThreeHiggerLevel{}
if err := o3.CheckObjectTwoIsReady(); err != nil {
    fmt.Println(err)
}

出力:

Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0

このアプローチでは、クリーンなファイルが提供されます。重複したロギングを回避し、コンテキストを保持する有益なエラー処理メカニズム

代替: エラー拡張

簡略化するために、別のアプローチは、次を使用して追加のコンテキストで元のエラーを拡張することです。 fmt.Errorf():

func (o *ObjectOne) CheckValue() error {
    if o.someValue == 0 {
        return fmt.Errorf("Object1 illegal state: value is %d", o.someValue)
    }
    return nil
}

使用法:

o3 := &ObjectThreeHiggerLevel{}
if err := o3.CheckObjectTwoIsReady(); err != nil {
    fmt.Println(err)
}

出力:

Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0

これこのアプローチはエラー アノテーションほど汎用性がありませんが、実装は簡単です。

以上が多層 Go 抽象化でエラー伝播を効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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