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!