Heim > Backend-Entwicklung > Golang > Unterstützen „errors.Is' und „errors.As' von Go rekursives Fehler-Wrapping?

Unterstützen „errors.Is' und „errors.As' von Go rekursives Fehler-Wrapping?

Patricia Arquette
Freigeben: 2024-12-14 19:23:10
Original
532 Leute haben es durchsucht

Does Go's `errors.Is` and `errors.As` Support Recursive Error Wrapping?

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 }
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage