Heim >Backend-Entwicklung >Golang >Wie kann ich in Go ein echtes rekursives Fehler-Wrapping und -Unwrapping erreichen?

Wie kann ich in Go ein echtes rekursives Fehler-Wrapping und -Unwrapping erreichen?

Susan Sarandon
Susan SarandonOriginal
2024-12-12 14:52:10649Durchsuche

How Can I Achieve True Recursive Error Wrapping and Unwrapping in Go?

Fehlerumschließung mit rekursiven Is() und As() in Go

Viele Entwickler empfehlen, Fehler in Go mithilfe von fmt.Errorf mit dem %w-Verb einzuschließen, aber dies Die Methode bietet keinen echten rekursiven Umbruch. Um Fehler mit Is() und As() rekursiv zu überprüfen, können benutzerdefinierte Fehlertypen verwendet werden.

Benutzerdefinierte Fehlertypen für die Rekursion

Hier ist ein benutzerdefinierter Fehlertyp „errorChain“, der Fehlerumbruch und rekursive Prüfungen unterstützt :

type errorChain struct {
    err  error
    next *errorChain
}

func Wrap(errs ...error) error {
    out := errorChain{err: errs[0]}

    n := &out
    for _, err := range errs[1:] {
        n.next = &errorChain{err: err}
        n = n.next
    }
    return out
}

Hinzufügen von Is() und As() zum benutzerdefinierten Typ

Der Schlüssel zur Aktivierung Bei rekursiven Prüfungen werden sowohl die Methoden Is() als auch As() für den benutzerdefinierten Typ implementiert. Diese Methoden ermöglichen Fehlervergleiche am in der Kette enthaltenen Fehler und nicht an der Kette selbst:

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) }

Verwendung von errorChain

Mit diesen Methoden können Sie Fehler umschließen und rekursive Prüfungen durchführen :

errs := Wrap(errors.New("error 0"), errors.New("error 1"), errors.New("error 2"))

fmt.Println(errors.Is(errs, errors.New("error 0")))  // true
fmt.Println(errors.Is(errs, errors.New("error 1")))  // true
fmt.Println(errors.Is(errs, errors.New("error 2")))  // true

Verwenden von Unwrap() zum Iterieren der Kette

The Unwrap() Mit der Methode in errorChain können Sie die umschlossenen Fehler in einer Kette durchlaufen:

var currentError error = errs
for {
    currentError = errors.Unwrap(currentError)
    if currentError == nil {
        break
    }
    fmt.Println(currentError)
}

Dieses Beispiel druckt alle Fehler in der Kette:

error 0
error 1
error 2

Das obige ist der detaillierte Inhalt vonWie kann ich in Go ein echtes rekursives Fehler-Wrapping und -Unwrapping 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