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 }
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"
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!