Maison > développement back-end > Golang > Comment puis-je gérer efficacement la propagation des erreurs dans les abstractions Go multicouches ?

Comment puis-je gérer efficacement la propagation des erreurs dans les abstractions Go multicouches ?

Susan Sarandon
Libérer: 2024-12-12 18:21:11
original
673 Les gens l'ont consulté

How Can I Effectively Handle Error Propagation in Multi-Layer Go Abstractions?

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

Utilisation :

o3 := &ObjectThreeHiggerLevel{}
if err := o3.CheckObjectTwoIsReady(); err != nil {
    fmt.Println(err)
}
Copier après la connexion
Copier après la connexion

Sortie :

Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Copier après la connexion
Copier après la connexion

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

Utilisation :

o3 := &ObjectThreeHiggerLevel{}
if err := o3.CheckObjectTwoIsReady(); err != nil {
    fmt.Println(err)
}
Copier après la connexion
Copier après la connexion

Sortie :

Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Copier après la connexion
Copier après la connexion

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!

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