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
Libérer: 2024-12-12 14:52:10
original
588 Les gens l'ont consulté

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
}
Copier après la connexion

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) }
Copier après la connexion

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
Copier après la connexion

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)
}
Copier après la connexion

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

error 0
error 1
error 2
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal