Heim >Backend-Entwicklung >Golang >Wie kann ich mit Is() und As() in Go einen rekursiven Fehlerumbruch erreichen?

Wie kann ich mit Is() und As() in Go einen rekursiven Fehlerumbruch erreichen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-11 10:42:11316Durchsuche

How Can I Achieve Recursive Error Wrapping with Is() and As() in Go?

Go-Fehler: Is() und As() unterstützen rekursives Fehler-Wrapping

In Go ist die Fehlerbehandlung von entscheidender Bedeutung für die Verwaltung und Analyse von Fehlern während der gesamten Anwendung. Die Fehlerschnittstelle bietet eine allgemeine Methode zur Darstellung von Fehlern und umfasst Methoden wie Is() und As() zur Fehlerintrospektion.

Es ist jedoch wichtig zu beachten, dass die Standardfehlerschnittstelle keine rekursive Fehlerumschließung unterstützt . Das bedeutet, dass Sie, wenn Sie fmt.Errorf zum Umschließen von Fehlern verwenden, Is() und As() nicht verwenden können, um rekursiv nach zugrunde liegenden Fehlern zu suchen.

Benutzerdefinierter Fehlertyp für rekursive Fehler Wrapping

Um ein rekursives Fehler-Wrapping zu erreichen, können Sie einen benutzerdefinierten Fehlertyp erstellen, der die Fehlerschnittstelle implementiert. Dieser Typ sollte einen Verweis auf den umschlossenen Fehler enthalten und benutzerdefinierte Is()- und As()-Methoden definieren, um rekursive Vergleiche zu ermöglichen.

Hier ist eine Beispielimplementierung eines rekursiven Fehlertyps:

type errorChain struct {
    err  error
    next *errorChain
}

func (c errorChain) Is(err error) bool {
    // Check the current error against the given error
    if c.err == err {
        return true
    }
    // Check if there is a wrapped error and recursively call Is()
    if c.next != nil {
        return c.next.Is(err)
    }
    return false
}

func (c errorChain) As(target interface{}) bool {
    // Check if the current error As() to the target interface
    if errors.As(c.err, target) {
        return true
    }
    // Check if there is a wrapped error and recursively call As()
    if c.next != nil {
        return c.next.As(target)
    }
    return false
}

Fehler rekursiv umschließen

Sobald Sie einen benutzerdefinierten Fehlertyp definiert haben, können Sie Fehler umschließen rekursiv mit einer Funktion wie der folgenden:

func Wrap(errs ...error) error {
    if len(errs) == 0 {
        return nil
    }
    // Create the first error in the chain
    out := &errorChain{err: errs[0]}
    // Iterate over the remaining errors
    for _, err := range errs[1:] {
        // Link the errors together
        out.next = &errorChain{err: err}
        out = out.next
    }
    return out
}

Verwendung

Sie können jetzt diesen benutzerdefinierten Fehlertyp verwenden, um Fehler zu umschließen und rekursiv nach zugrunde liegenden Fehlern zu suchen, indem Sie Is( ) und As(). Zum Beispiel:

var Err1 = errors.New("error 1")
var Err2 = errors.New("error 2")
var Err3 = errors.New("error 3")

err := Wrap(Err1, Err2, Err3)

fmt.Println(errors.Is(err, Err2)) // true
fmt.Println(errors.Is(err, Err3)) // true
fmt.Println(errors.Is(err, Err0)) // false

Fazit

Durch die Erstellung eines benutzerdefinierten Fehlertyps mit rekursiven Is()- und As()-Methoden können Sie eine rekursive Fehlerumschließung und -ausführung erreichen Präzisere Fehlerbehandlung in Ihren Go-Anwendungen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Is() und As() in Go einen rekursiven Fehlerumbruch erreichen?. 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