Heim >Backend-Entwicklung >Golang >Wie kann ich die Fehlerausbreitung in mehrschichtigen Go-Abstraktionen effektiv bewältigen?

Wie kann ich die Fehlerausbreitung in mehrschichtigen Go-Abstraktionen effektiv bewältigen?

Susan Sarandon
Susan SarandonOriginal
2024-12-12 18:21:11662Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn