Fehlerausbreitung in mehrschichtigen Abstraktionen
In Go kann die Fehlerbehandlung über mehrere Abstraktionsebenen hinweg aufgrund der Notwendigkeit von zu einer Herausforderung werden den Fehler ständig nach oben weitergeben. Dies führt häufig zu doppelten Protokollierungsmeldungen oder zum Verlust von Kontextinformationen.
Empfohlene Lösung: Fehleranmerkung
Die bevorzugte Methode zur Fehlerbehandlung besteht darin, Fehler so zu kommentieren, wie sie sind verschiedene Abstraktionsebenen durchlaufen. Dies ermöglicht es, den Kontext des ursprünglichen Fehlers beizubehalten und gleichzeitig auf jeder Ebene zusätzliche Informationen hinzuzufügen.
Mithilfe einer Bibliothek wie „github.com/pkg/errors“ kann die Fehlerbehandlung wie folgt implementiert werden folgt:
// 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 }
Verwendung:
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
Ausgabe:
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Dieser Ansatz sorgt für eine saubere und informativer Fehlerbehandlungsmechanismus, der doppelte Protokollierung vermeidet und den Kontext bewahrt Informationen.
Alternative: Fehlererweiterung
Der Einfachheit halber besteht ein alternativer Ansatz darin, den ursprünglichen Fehler durch zusätzliche Kontextverwendung zu erweitern fmt.Errorf():
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return fmt.Errorf("Object1 illegal state: value is %d", o.someValue) } return nil }
Verwendung:
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
Ausgabe:
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Dies Der Ansatz ist weniger vielseitig als die Fehleranmerkung, aber einfacher zu implementieren.
Das obige ist der detaillierte Inhalt vonWie kann ich die Fehlerausbreitung in mehrschichtigen Go-Abstraktionen effektiv bewältigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!