Heim >Backend-Entwicklung >Golang >Bieten „Is()' und „As()' von Go wirklich eine rekursive Fehlerentpackung?

Bieten „Is()' und „As()' von Go wirklich eine rekursive Fehlerentpackung?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-15 19:29:10936Durchsuche

Does Go's `Is()` and `As()` Truly Offer Recursive Error Unwrapping?

Ist Gos Fehlerbehandlungs-Rekursionsanspruch korrekt?

Die Fehlerbehandlungsfunktionen von Go, Is() und As(), behaupten, rekursiv zu sein und ermöglichen das Entpacken mehrerer verschachtelter Elemente Fehler. Es ist jedoch unklar, ob es einen integrierten Typ gibt, der die Fehlerschnittstelle implementiert und diese rekursive Funktionalität problemlos unterstützt.

Fehlerhafte benutzerdefinierte Implementierungen

Versuche, benutzerdefinierte zu erstellen Bei Fehlertypen treten häufig Probleme auf, die darauf zurückzuführen sind, dass Fehler in Go anhand der Adresse verglichen werden. Ein benutzerdefinierter Typ, der Fehler als Zeiger umschließt, führt zu unerwartetem Verhalten, z. B. wenn sich der geänderte übergeordnete Fehler auf nachfolgende Umbrüche auswirkt.

Eine praktikable Lösung

Eine robustere Lösung erfordert das Erstellen ein neuer Fehlertyp, errorChain. Dieser Typ enthält ein Fehlerfeld zum Speichern des aktuellen Fehlers und ein nächstes Feld zum Verweisen auf den nächsten Fehler in der Kette. Darüber hinaus werden die Methoden Is() und As() implementiert, um das rekursive Entpacken von Fehlern zu erleichtern.

Einpacken und Entpacken

Die Wrap()-Funktion nimmt mehrere Fehler auf und erstellt sie ein errorChain-Objekt und verknüpft sie miteinander. Die Funktion „Unwrap()“ durchläuft die Kette und gibt den nächsten Fehler in der Sequenz zurück.

Beispiel

Mit dem Typ „errorChain“ können Sie Fehler rekursiv ein- und auspacken:

type errorChain struct {
    err  error
    next *errorChain
}

func Wrap(errs ...error) error {
    out := errorChain{err: errs[0]}

    n := &out
    for _, err := range errs[1:] {
        n.next = &errorChain{err: err}
        n = n.next
    }

    return out
}

func (c errorChain) Is(err error) bool {
    return c.err == err
}

func (c errorChain) As(target any) bool {
    return errors.As(c.err, target)
}

Spielplatz: https://go.dev/play/p/6BYGgIb728k

Das obige ist der detaillierte Inhalt vonBieten „Is()' und „As()' von Go wirklich eine rekursive Fehlerentpackung?. 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