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

Gestion des erreurs dans Go : bonnes pratiques et pièges

WBOY
Libérer: 2023-06-17 10:56:55
original
1203 Les gens l'ont consulté

Dans le langage Go, la gestion des erreurs est une partie très importante. Une bonne gestion des erreurs peut améliorer la fiabilité et la maintenabilité du programme, en particulier dans les grands projets. Cet article présentera les meilleures pratiques de gestion des erreurs dans le langage Go et répertoriera quelques pièges courants.

La base de la gestion des erreurs : le type d'erreur

En langage Go, le type d'erreur est une interface avec la méthode Error(), par exemple :

type error interface {
    Error() string
}
Copier après la connexion

Il est très simple d'utiliser le type d'erreur par défaut du langage Go :

err := errors.New("this is an error message")
if err != nil {
    fmt.Println(err)
}
Copier après la connexion

Utiliser la personnalisation Il est également facile de saisir des erreurs. Implémentez simplement la méthode Error() :

type MyError struct {
    Msg string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("MyError: %s", e.Msg)
}

func main() {
    err := &MyError{Msg: "this is a custom error message"}
    if err != nil {
        fmt.Println(err)
    }
}
Copier après la connexion

Meilleure pratique : ne pas ignorer les erreurs

Ignorer les erreurs est un piège de gestion des erreurs très courant. Par exemple :

file, err := os.Open("file.txt")
// 文件不存在或者打开文件的过程中发生了任何错误
// 都应该进行错误处理,例如:
if err != nil {
    log.Fatal(err)
}
// 这里忽略了err,如果发生了错误,程序会在这一行崩溃
defer file.Close()
Copier après la connexion

Cette situation peut se produire dans du code existant ou par des programmeurs paresseux. Pour éviter cette erreur, les erreurs renvoyées doivent toujours être vérifiées et traitées.

Bonne pratique 2 : renvoyer les erreurs le plus tôt possible

Dans le langage Go, la gestion des erreurs est généralement gérée en renvoyant une valeur du type d'erreur. Par conséquent, lorsqu’une erreur est détectée, elle doit être renvoyée immédiatement. Par exemple :

func myFunc() error {
    // do something
    if err := someFunc(); err != nil {
        return err  // 尽早返回错误
    }
    // do something else
    if err := anotherFunc(); err != nil {
        return err  // 尽早返回错误
    }
    // do something else
    return nil
}
Copier après la connexion

Renvoyer les erreurs le plus tôt possible peut rendre le code plus concis et clair, facile à déboguer et à maintenir.

Bonne pratique 3 : éviter les erreurs causées par les variables locales

En langage Go, les variables locales sont automatiquement recyclées à la fin de la fonction. Si des variables comprenant des informations d'erreur sont déclarées à la fin de la fonction, des erreurs peuvent survenir. . Par exemple :

func myFunc() error {
    var data []byte
    // 这里忽略了错误,如果outOfMemory()函数返回了一个非nil值
    // 程序会在下一行崩溃
    outOfMemory()
    // do something with data
    return nil
}
Copier après la connexion

Pour éviter cette situation, les variables doivent être déclarées avant l'instruction de vérification des erreurs.

func myFunc() error {
    // 先声明错误变量
    var err error
    var data []byte
    if err = outOfMemory(); err != nil {
        return err  // 尽早返回错误
    }
    // do something with data
    return nil
}
Copier après la connexion

Quatrième pratique : utiliser des codes d'erreur au lieu de chaînes d'erreur

Dans le langage Go, il est très courant d'utiliser des chaînes d'erreur pour décrire les messages d'erreur. Cependant, cette approche augmente la complexité du programme et rend plus difficile la détermination du type d'erreur. Par conséquent, il est préférable d’utiliser des codes d’erreur au lieu de chaînes d’erreur.

Par exemple :

type MyErrorType int

const (
    ErrOutOfMemory MyErrorType = iota
    ErrInvalidInput
)

func (e MyErrorType) Error() string {
    switch e {
    case ErrOutOfMemory:
        return "out of memory"
    case ErrInvalidInput:
        return "invalid input"
    default:
        return "unknown error"
    }
}

func myFunc() error {
    // 这里返回错误码,可以更好的描述错误信息并且和其他包的错误相对独立
    return ErrOutOfMemory
}
Copier après la connexion

Meilleure pratique cinq : la gestion des erreurs doit être prévisible et réparable

La gestion des erreurs doit être prévisible et réparable. Cela signifie que les programmeurs doivent écrire un code de gestion des erreurs approprié pour toutes les conditions d'erreur possibles et s'assurer que le code de gestion des erreurs peut corriger l'erreur ou fournir des informations précises sur l'erreur. Par exemple :

func myFunc() error {
    file, err := os.Create("file.txt")
    if err != nil {
        return fmt.Errorf("cannot create file: %v", err)
    }
    defer func() {
        if err := file.Close(); err != nil {
            log.Fatalf("cannot close file: %v", err)
        }
    }()
    if _, err := file.Write([]byte("hello, world
")); err != nil {
        return fmt.Errorf("write error: %v", err)
    }
    return nil
}
Copier après la connexion

Les programmeurs doivent décrire clairement le problème dans la gestion des erreurs, y compris la cause et la solution du problème. De cette façon, les erreurs peuvent être corrigées et résolues plus facilement.

Piège 1 : Utiliser panic() à la place des erreurs

En langage Go, la fonction panic() est parfois utilisée à la place des erreurs. L’inconvénient de cette approche est que si une erreur se produit, tout le programme plantera. Par conséquent, panic() doit être évité autant que possible. panic() ne doit être utilisé que lorsqu'il est impossible pour le programme de continuer à s'exécuter.

Piège 2 : Ne fournissez pas d'informations d'erreur trop détaillées

Fournir des informations d'erreur trop détaillées augmentera la complexité du programme et peut entraîner des risques de sécurité. Par conséquent, seules les informations d’erreur nécessaires doivent être fournies, garantissant ainsi la confidentialité et la sécurité.

Piège 3 : Ne faites pas l'éloge du code de gestion des erreurs

Le code de gestion des erreurs est aussi important que les autres codes, mais vous devez éviter d'écrire trop de code de gestion des erreurs et qui est compliqué. Le code de gestion des erreurs doit être clair et sans ambiguïté, mais ne doit pas être volumineux ou redondant.

Résumé

La gestion des erreurs fait partie intégrante des programmes linguistiques Go. Une bonne gestion des erreurs peut améliorer la fiabilité et la maintenabilité de votre programme et aider à rechercher et à corriger les erreurs. Utilisez les meilleures pratiques présentées dans cet article et évitez les pièges courants de gestion des erreurs pour rendre vos programmes Go plus stables et robustes.

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