Encapsulage récursif des erreurs dans Go
Le mécanisme de gestion des erreurs de Go fournit des méthodes telles que Is() et As() pour l'inspection des erreurs. Cependant, on suppose souvent que ces méthodes prennent en charge le traitement récursif des erreurs. Ce n'est pas tout à fait vrai.
L'utilisation de fmt.Errorf avec le verbe %w permet uniquement un enroulement superficiel des erreurs. Pour obtenir une véritable récursivité, un type d'erreur personnalisé est nécessaire.
En règle générale, un type d'erreur personnalisé inclut un pointeur vers l'erreur encapsulée ainsi qu'une méthode pour la déballer. Cependant, le simple fait d’encapsuler les erreurs de cette manière introduit un problème. Si plusieurs erreurs encapsulées partagent le même pointeur, la comparaison des erreurs échouera puisque les erreurs Go sont comparées par adresse.
Une solution consiste à implémenter les méthodes Is() et As() dans le type d'erreur personnalisé. Ces méthodes doivent comparer l'erreur intégrée au lieu du type personnalisé lui-même, permettant un emballage récursif complet des erreurs sans problèmes basés sur l'adresse.
Par exemple, voici une version simplifiée d'un type d'erreur qui prend en charge l'emballage récursif :
type errorChain struct { err error next *errorChain } 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) } func (c errorChain) Unwrap() error { return c.next }
Ce type d'erreur peut ensuite être utilisé pour envelopper les erreurs comme vous le souhaitez, permettant une inspection complète des erreurs à l'aide de Is() et As().
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!