Maison >développement back-end >Golang >Comment puis-je obtenir un véritable emballage et déballage d'erreurs récursives en Go ?

Comment puis-je obtenir un véritable emballage et déballage d'erreurs récursives en Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-12 14:52:10575parcourir

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

Encapsulage des erreurs avec Is() et As() récursifs dans Go

De nombreux développeurs recommandent d'encapsuler les erreurs dans Go en utilisant fmt.Errorf avec le verbe %w, mais ceci La méthode ne fournit pas un véritable emballage récursif. Pour vérifier les erreurs de manière récursive à l'aide de Is() et As(), des types d'erreur personnalisés peuvent être utilisés.

Types d'erreur personnalisés pour la récursion

Voici un type d'erreur personnalisé errorChain qui prend en charge le traitement des erreurs et les vérifications récursives. :

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
}

Ajout de Is() et As() au type personnalisé

La clé pour activer Les vérifications récursives consistent à implémenter les méthodes Is() et As() sur le type personnalisé. Ces méthodes permettent des comparaisons d'erreurs au niveau de l'erreur contenue dans la chaîne, plutôt que de la chaîne elle-même :

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

Utilisation de errorChain

Avec ces méthodes en place, vous pouvez envelopper les erreurs et effectuer des vérifications récursives :

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

Utiliser Unwrap() pour itérer la chaîne

La méthode Unwrap() in errorChain permet de parcourir les erreurs encapsulées dans une chaîne :

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

Cet exemple imprime toutes les erreurs de la chaîne :

error 0
error 1
error 2

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn