Maison > développement back-end > Golang > Les « Is() » et « As() » de Go offrent-ils vraiment un déballage récursif des erreurs ?

Les « Is() » et « As() » de Go offrent-ils vraiment un déballage récursif des erreurs ?

Patricia Arquette
Libérer: 2024-12-15 19:29:10
original
932 Les gens l'ont consulté

Does Go's `Is()` and `As()` Truly Offer Recursive Error Unwrapping?

La revendication de récursion de gestion des erreurs de Go est-elle exacte ?

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

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!

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