Maison >développement back-end >Golang >Comment puis-je obtenir un véritable emballage et déballage d'erreurs récursives en 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.
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 }
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) }
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
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!