多層抽象化でのエラー伝播
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 サイトの他の関連記事を参照してください。