Les fonctions de gestion des erreurs de Go, Is() et As(), prétendent être récursives, permettant le déballage de plusieurs imbriqués erreurs. Cependant, il n'est pas clair s'il existe un type intégré qui implémente l'interface d'erreur et prend en charge cette fonctionnalité récursive sans problème.
Implémentations personnalisées défectueuses
Tentatives de création personnalisée Les types d'erreurs rencontrent souvent des problèmes liés au fait que les erreurs sont comparées par adresse dans Go. Un type personnalisé qui encapsule les erreurs sous forme de pointeurs entraîne un comportement inattendu, tel que l'erreur parent modifiée affectant les encapsulations ultérieures.
Une solution réalisable
Une solution plus robuste consiste à créer un nouveau type d'erreur, errorChain. Ce type contient un champ err pour stocker l'erreur actuelle et un champ suivant pour référencer l'erreur suivante dans la chaîne. De plus, il implémente les méthodes Is() et As() pour faciliter le déballage récursif des erreurs.
Enveloppement et déballage
La fonction Wrap() prend plusieurs erreurs, crée un objet errorChain et les relie ensemble. La fonction Unwrap() parcourt la chaîne et renvoie l'erreur suivante dans la séquence.
Exemple
En utilisant le type errorChain, vous pouvez envelopper et déballer les erreurs de manière récursive :
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 } func (c errorChain) Is(err error) bool { return c.err == err } func (c errorChain) As(target any) bool { return errors.As(c.err, target) }
Aire de jeux : https://go.dev/play/p/6BYGgIb728k
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!