Maison > développement back-end > Golang > Les « error.Is » et « error.As » de Go prennent-ils en charge le wrapping récursif des erreurs ?

Les « error.Is » et « error.As » de Go prennent-ils en charge le wrapping récursif des erreurs ?

Patricia Arquette
Libérer: 2024-12-14 19:23:10
original
532 Les gens l'ont consulté

Does Go's `errors.Is` and `errors.As` Support Recursive Error Wrapping?

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

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!

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