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
Susan Sarandonoriginal
2024-12-12 18:21:11673parcourir

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
}

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!

Déclaration:
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