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
Freigeben: 2024-12-12 14:52:10
Original
574 Leute haben es durchsucht

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

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

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

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

Dieses Beispiel druckt alle Fehler in der Kette:

error 0
error 1
error 2
Nach dem Login kopieren

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!

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