Go-Fehler: Die Geheimnisse von Is() und As() aufdecken
In Go ist die Fehlerbehandlung entscheidend für die Bereitstellung aussagekräftiger Diagnosen und Implementierung robuster Programme. Das Fehlerpaket bietet die Funktionen Is() und As() zum Bestimmen der Fehlergleichheit bzw. zum Extrahieren spezifischer Details. Ein häufiges Missverständnis besteht darin, dass diese Funktionen rekursives Fehler-Wrapping unterstützen und damit das Entpacken mehrerer verschachtelter Fehler ermöglichen.
Bei näherer Betrachtung bietet die Standardfunktion fmt.Errorf jedoch kein rekursives Fehler-Wrapping. Dies bedeutet, dass das Umschließen von Fehlern mit %w nicht das vollständige Durchlaufen einer Fehlerkette ermöglicht.
Um dieses Problem zu beheben, können benutzerdefinierte Fehlertypen definiert werden, die die Fehlerschnittstelle und ihre eigenen Is() und implementieren As()-Methoden. Dies ermöglicht das rekursive Entpacken mehrerer verschachtelter Fehler.
Beispiel:
type customError struct { err error wrapped *customError } func (c *customError) Error() string { if c.err != nil { return c.err.Error() } return "Custom error without cause" } func (c *customError) Is(err error) bool { if c.err != nil { return errors.Is(c.err, err) } return false } func (c *customError) As(target interface{}) bool { if c.err != nil { return errors.As(c.err, target) } return false } func Wrap(errs ...error) error { var rootError *customError for i := len(errs) - 1; i >= 0; i-- { rootError = &customError{ err: errs[i], wrapped: rootError, } } return rootError }
Mit diesem benutzerdefinierten Fehlertyp können Sie problemlos mehrere Fehler ein- und auspacken und rekursive Is() und As ausführen () prüft:
err := Wrap(Err1, Err2, Err3) fmt.Println(errors.Is(err, Err1)) // true fmt.Println(errors.Is(err, Err3)) // false var errType ErrType errors.As(err, &errType) fmt.Println(errType) // "my error type"
Während diese benutzerdefinierte Implementierung eine rekursive Fehlerentpackung ermöglicht, gibt es derzeit keine Integrierter Typ in der Go-Standardbibliothek, der diese Funktionalität sofort bereitstellt. Bibliotheken wie github.com/pkg/errors bieten jedoch zusätzliche Fehlerbehandlungsfunktionen, einschließlich rekursivem Entpacken, die in Ihren eigenen Projekten möglicherweise eine Überlegung wert sind.
Das obige ist der detaillierte Inhalt vonWie gehen die Funktionen „Is()' und „As()' von Go mit rekursivem Fehlerumbruch um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!