Maison > développement back-end > Golang > Comment les fonctions « Is() » et « As() » de Go gèrent-elles le wrapper d'erreurs récursives ?

Comment les fonctions « Is() » et « As() » de Go gèrent-elles le wrapper d'erreurs récursives ?

Patricia Arquette
Libérer: 2024-12-16 10:52:10
original
688 Les gens l'ont consulté

How Do Go's `Is()` and `As()` Functions Handle Recursive Error Wrapping?

Erreurs Go : percer les mystères de Is() et As()

Dans Go, la gestion des erreurs est cruciale pour fournir des diagnostics et des diagnostics significatifs. mettre en œuvre des programmes solides. Le package d’erreurs propose les fonctions Is() et As() pour déterminer l’égalité des erreurs et extraire des détails spécifiques, respectivement. Une idée fausse courante est que ces fonctions prennent en charge le traitement récursif des erreurs, permettant le déballage de plusieurs erreurs imbriquées.

Cependant, après un examen plus approfondi, la fonction fmt.Errorf standard ne fournit pas de traitement récursif des erreurs. Cela signifie que l'encapsulation des erreurs à l'aide de %w ne permet pas le parcours complet d'une chaîne d'erreurs.

Pour résoudre ce problème, des types d'erreur personnalisés peuvent être définis qui implémentent l'interface d'erreur et implémentent leur propre Is() et Méthodes As(). Cela permet le déballage récursif de plusieurs erreurs imbriquées.

Exemple :

type customError struct {
    err     error
    wrapped *customError
}

func (c *customError) Error() string {
    if c.err != nil {
        return c.err.Error()
    }
    return "Custom error without cause"
}

func (c *customError) Is(err error) bool {
    if c.err != nil {
        return errors.Is(c.err, err)
    }
    return false
}

func (c *customError) As(target interface{}) bool {
    if c.err != nil {
        return errors.As(c.err, target)
    }
    return false
}

func Wrap(errs ...error) error {
    var rootError *customError
    for i := len(errs) - 1; i >= 0; i-- {
        rootError = &customError{
            err:     errs[i],
            wrapped: rootError,
        }
    }
    return rootError
}
Copier après la connexion

Avec ce type d'erreur personnalisé, vous pouvez facilement encapsuler et déballer plusieurs erreurs et exécuter des Is() et As récursifs. () vérifie :

err := Wrap(Err1, Err2, Err3)
fmt.Println(errors.Is(err, Err1)) // true
fmt.Println(errors.Is(err, Err3)) // false

var errType ErrType
errors.As(err, &errType)
fmt.Println(errType) // "my error type"
Copier après la connexion

Bien que cette implémentation personnalisée fournisse un déballage récursif des erreurs, il n'existe actuellement aucun type intégré dans la bibliothèque standard Go qui fournit cette fonctionnalité prête à l'emploi. Cependant, des bibliothèques comme github.com/pkg/errors offrent des capacités supplémentaires de gestion des erreurs, notamment le déballage récursif, qui peuvent être intéressantes à prendre en compte dans vos propres projets.

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