Heim >Backend-Entwicklung >Golang >Wie gehen die Funktionen „Is()' und „As()' von Go mit rekursivem Fehlerumbruch um?

Wie gehen die Funktionen „Is()' und „As()' von Go mit rekursivem Fehlerumbruch um?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-16 10:52:10690Durchsuche

How Do Go's `Is()` and `As()` Functions Handle Recursive Error Wrapping?

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!

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