Rekursives Fehler-Wrapping in Go
Der Fehlerbehandlungsmechanismus von Go stellt Methoden wie Is() und As() für die Fehlerprüfung bereit. Allerdings wird häufig davon ausgegangen, dass diese Methoden rekursives Fehlerumschließen unterstützen. Das ist nicht ganz richtig.
Die Verwendung von fmt.Errorf mit dem %w-Verb ermöglicht nur eine flache Fehlerumschließung. Um eine echte Rekursion zu erreichen, ist ein benutzerdefinierter Fehlertyp erforderlich.
Typischerweise würde ein benutzerdefinierter Fehlertyp einen Zeiger auf den umschlossenen Fehler sowie eine Methode zum Entpacken enthalten. Das einfache Umschließen von Fehlern auf diese Weise bringt jedoch ein Problem mit sich. Wenn mehrere umschlossene Fehler denselben Zeiger verwenden, schlägt der Fehlervergleich fehl, da Go-Fehler anhand der Adresse verglichen werden.
Eine Lösung besteht darin, die Methoden Is() und As() innerhalb des benutzerdefinierten Fehlertyps zu implementieren. Diese Methoden sollten den eingebetteten Fehler und nicht den benutzerdefinierten Typ selbst vergleichen und so ein vollständiges rekursives Fehlerumschließen ohne adressbasierte Probleme ermöglichen.
Hier ist beispielsweise eine vereinfachte Version eines Fehlertyps, der rekursives Umschließen unterstützt:
type errorChain struct { err error next *errorChain } func (c errorChain) Is(err error) bool { return errors.Is(c.err, err) } func (c errorChain) As(target any) bool { return errors.As(c.err, target) } func (c errorChain) Unwrap() error { return c.next }
Dieser Fehlertyp kann dann verwendet werden, um Fehler wie gewünscht zu verpacken, was eine vollständige Fehlerprüfung mit Is() und As() ermöglicht.
Das obige ist der detaillierte Inhalt vonUnterstützen „errors.Is' und „errors.As' von Go rekursives Fehler-Wrapping?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!