Go で複数の抽象レベルにわたるエラーを効果的に処理する方法
エラーを適切かつ一貫して処理することは、大規模なシステムの健全性と信頼性を維持するために重要です。そして複雑な Go アプリケーション。ただし、複数の抽象化レイヤーを使用する場合、ログの重複や重要なコンテキストの損失を避けながらエラーを効果的に管理することが課題になります。
コンテキスト伝播のためのエラーの注釈
抽象化レベル全体でエラーを処理するための強力な手法は、エラー アノテーションです。このアプローチには、新しいエラー値を作成し、その中で元のエラーをラップし、エラーの原因に関する追加のコンテキストと情報を提供することが含まれます。
エラー アノテーションを実装するには、github.com/pkg/errors のようなライブラリを使用できます。 。エラーをラップするための関数 (errors.Wrap()) とラップされたエラーを抽出するための関数 (errors.Cause()) が提供されます。
エラー注釈を示す例は次のとおりです。
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return errors.New("Object1 illegal state: value is 0") } return nil } func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error { if err := oT.objectOne.CheckValue(); err != nil { return errors.Wrap(err, "Object2 illegal state: Object1 is invalid") } return nil } func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return errors.Wrap(err, "Object3 illegal state: Object2 is invalid") } return nil }
ユーザーがObjectThreeHiggerLevel のオブジェクトがエラーの処理を決定すると、元のメッセージを保持しながら、すべての抽象化レベルを通じてエラーを追跡する包括的なエラー メッセージを受け取ります。 context.
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
出力:
Object3 illegal state: Object2 is invalid: Object2 illegal state: Object1 is invalid: Object1 illegal state: value is 0
単純化された伝播のためのエラーの拡張
より単純なアプローチを好む場合は、次のこともできます。 「拡張」エラーを処理するには、fmt.Errorf() を使用して、より説明的なエラー メッセージを作成します。このメソッドはアノテーションよりも柔軟性に劣りますが、それでもいくつかのコンテキスト情報を追加できます。
fmt.Errorf() を使用した例:
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return fmt.Errorf("Object1 illegal state: value is %d", o.someValue) } return nil } func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error { if err := oT.objectOne.CheckValue(); err != nil { return fmt.Errorf("Object2 illegal state: %v", err) } return nil } func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return fmt.Errorf("Object3 illegal state: %v", err) } return nil }
ObjectThreeHiggerLevel で処理するときのエラー メッセージ:
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
エラー アノテーションまたは拡張機能を使用することで、異なる抽象化レベルでエラーを効果的に処理し、重複を回避できます。ログを記録し、エラー調査と解決のために関連するすべてのコンテキストが確実に保存されるようにします。
以上がGo で複数の抽象化レベルにわたるエラーを効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。