Propagation des erreurs dans les abstractions multicouches
Dans Go, la gestion des erreurs sur plusieurs niveaux d'abstraction peut devenir un défi en raison de la nécessité de transmettre continuellement l’erreur vers le haut. Cela conduit souvent à des messages de journalisation en double ou à la perte d'informations contextuelles.
Solution recommandée : Annotation des erreurs
La méthode préférée de gestion des erreurs consiste à annoter les erreurs telles qu'elles sont. passé par différents niveaux d’abstraction. Cela permet de préserver le contexte de l'erreur d'origine tout en ajoutant des informations supplémentaires à chaque niveau.
En utilisant une bibliothèque comme "github.com/pkg/errors", la gestion des erreurs peut être implémentée comme suit :
// Wraps the original error with additional context. func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return errors.New("Object1 illegal state: value is 0") } return nil } // Annotates the original error with context. func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error { if err := oT.objectOne.CheckValue(); err != nil { return errors.Wrap(err, "Object2 illegal state: Object1 is invalid") } return nil } // Preserves the annotated error stack. func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return errors.Wrap(err, "Object3 illegal state: Object2 is invalid") } return nil }
Utilisation :
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
Sortie :
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Cette approche fournit un et un mécanisme informatif de gestion des erreurs qui évite la journalisation en double et préserve le contexte informations.
Alternative : extension d'erreur
Pour plus de simplicité, une approche alternative consiste à étendre l'erreur d'origine avec un contexte supplémentaire en utilisant fmt.Errorf() :
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return fmt.Errorf("Object1 illegal state: value is %d", o.someValue) } return nil }
Utilisation :
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
Sortie :
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Ce L'approche est moins polyvalente que l'annotation d'erreur mais est plus simple à mettre en œuvre.
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!