Maison > développement back-end > Golang > le corps du texte

Comment utiliser la gestion des erreurs dans Go ?

王林
Libérer: 2023-05-11 15:58:52
original
1526 Les gens l'ont consulté

En langage Go, la gestion des erreurs est une tâche très importante. Une bonne gestion des erreurs garantit la fiabilité et la stabilité de votre code. Cet article explique comment utiliser la gestion des erreurs dans Go, y compris les types d'erreurs, les méthodes de gestion des erreurs, la transmission des erreurs, etc.

1. Type d'erreur

En langage Go, le type d'erreur est défini comme un type d'interface, qui n'a qu'une seule méthode : la chaîne Error(). Par conséquent, tant que cette méthode est implémentée, elle peut être un type d’erreur. Par exemple :

type MyError struct {
    errno int
    errmsg string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("error (%d): %s", e.errno, e.errmsg)
}
Copier après la connexion

Le code ci-dessus définit un type d'erreur personnalisé nommé MyError, qui contient deux variables membres : le code d'erreur et le message d'erreur, et implémente la méthode de chaîne Error(). Dans les applications pratiques, nous pouvons définir plusieurs types d’erreurs différents selon les besoins pour représenter différentes situations d’erreur.

2. Méthodes de gestion des erreurs et leurs avantages et inconvénients

Dans Go, les erreurs sont généralement traitées de diverses manières, notamment le retour d'erreurs, la panique/récupération, l'enregistrement du journal, etc. Chacune de ces méthodes a ses propres avantages et inconvénients. Choisir la méthode appropriée peut améliorer la maintenabilité et la stabilité du code. Ces méthodes sont présentées une par une ci-dessous.

  1. Erreur de retour

Pendant l'exécution de la fonction, si une erreur est rencontrée, une valeur de type d'erreur peut être renvoyée pour indiquer l'état de l'erreur. Par exemple :

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("divide by zero")
    }
    return a/b, nil
}
Copier après la connexion

Le code ci-dessus définit une fonction nommée Divide, qui est utilisée pour diviser deux nombres. Si le diviseur est 0, un message d'erreur est renvoyé. Lors de l'appel de cette fonction, vous pouvez détecter si une erreur s'est produite de la manière suivante :

result, err := Divide(10, 0)
if err != nil {
    fmt.Println(err.Error())
    return
}
fmt.Println(result)
Copier après la connexion

Parmi elles, la variable err est utilisée pour stocker les informations d'erreur renvoyées par la fonction, dans cet exemple sa valeur est "diviser par zéro".

Les avantages de cette méthode sont : claire et facile à déboguer et à dépanner. C'est également une méthode de gestion des erreurs officiellement recommandée par Go. L'inconvénient est que vous devez ajouter des valeurs de retour supplémentaires à chaque fonction, ce qui peut rendre le code verbeux.

  1. Panic/Recover

Dans le langage Go, le mécanisme panic/recover peut être utilisé pour gérer certaines erreurs irrécupérables. Lorsque le programme rencontre une instruction de panique, il arrêtera immédiatement l'exécution et lancera une exception de panique vers le haut. Le programme ne se terminera pas tant qu'il n'aura pas été intercepté par recovery ou qu'il n'aura pas atteint la fonction de niveau supérieur. Par exemple :

func Process() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("panic:", r)
        }
    }()
    fmt.Println("Begin")
    panic("error occured")
    fmt.Println("End")
}
Copier après la connexion

Le code ci-dessus définit une fonction nommée Process, dans laquelle les instructions defer et panic sont utilisées. Lorsque la fonction exécute l'instruction de panique, elle arrêtera immédiatement l'exécution, commencera à exécuter le code dans le bloc d'instruction defer et affichera « panique : une erreur s'est produite ».

L'avantage de cette méthode est qu'elle peut capturer certaines erreurs irrécupérables, permettant au programme de restaurer certaines ressources ou d'effectuer un travail de nettoyage avant de planter. L'inconvénient est que si le mécanisme de panique/récupération est abusé, la structure du programme peut devenir confuse et difficile à maintenir.

  1. Enregistrement du journal

Dans Go, vous pouvez généralement utiliser l'enregistrement du journal pour gérer les erreurs et enregistrer différents niveaux de journalisation en fonction de différentes situations. Par exemple :

func Add(a, b int) int {
    if b == 0 {
        log.Printf("Error: divide by zero
")
        return 0
    }
    return a + b
}
Copier après la connexion

Le code ci-dessus définit une fonction nommée Add, qui est utilisée pour ajouter deux nombres. Si le diviseur est 0, un message d'erreur est généré à l'aide de l'enregistrement du journal. Si une erreur se produit lors de l'appel de cette fonction, vérifiez simplement le journal correspondant. L'avantage de cette méthode est qu'elle peut facilement enregistrer les informations sur les erreurs pour faciliter le dépannage ; mais l'inconvénient est qu'elle ne peut pas interrompre le déroulement du programme en cours, ce qui pourrait entraîner la propagation d'erreurs dans le système.

3. Transmission d'erreur

Dans le langage Go, les informations, y compris les informations d'erreur, peuvent être transférées entre les fonctions via des valeurs de retour. De manière générale, si une fonction peut générer des erreurs, elle doit être vérifiée et les informations d'erreur transmises à l'appelant. Par exemple :

func processData(data []byte) error {
    _, err := processItem(data[0])
    if err != nil {
        return err
    }
    // continue to process data...
}
Copier après la connexion

Le code ci-dessus définit une fonction appelée processData qui traite un tableau d'octets et appelle une fonction processItem lorsque le premier octet est traité. Si la fonction processItem renvoie une erreur, les informations d'erreur sont renvoyées à l'appelant.

Dans les applications pratiques, afin de réduire le code de vérification d'erreurs répétées, des fonctions différées et anonymes peuvent être utilisées pour le simplifier. Par exemple :

func processData(data []byte) error {
    f, err := os.Open("data.log")
    if err != nil {
        return err
    }
    defer f.Close()
    // continue to process data...
}
Copier après la connexion

Le code ci-dessus renverra directement un message d'erreur si une erreur se produit lors de l'ouverture du fichier. A la fin de l'exécution de la fonction, quelle que soit la raison de la sortie, le fichier sera d'abord fermé pour garantir que toutes les ressources ont été libérées avant le retour du programme.

4. Résumé

La gestion des erreurs dans le langage Go est une tâche très importante. L'utilisation de méthodes et de types d'erreurs appropriés peut améliorer la maintenabilité et la stabilité du code. Dans les applications pratiques, différentes méthodes de traitement doivent être sélectionnées en fonction de différents scénarios, et le message d'erreur doit être clair et concis pour faciliter le dépannage et éviter les plantages du programme dus à des interruptions incorrectes. Dans le même temps, lors de la transmission des informations d'erreur, vous pouvez utiliser des fonctions différées et anonymes pour simplifier le code et améliorer la lisibilité et la maintenabilité du code.

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!

Étiquettes associées:
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal