Maison > développement back-end > Golang > Pourquoi « return nil, err » est-il incorrect dans une fonction « defer » utilisée pour la gestion des erreurs dans Go ?

Pourquoi « return nil, err » est-il incorrect dans une fonction « defer » utilisée pour la gestion des erreurs dans Go ?

Linda Hamilton
Libérer: 2024-11-14 12:10:02
original
276 Les gens l'ont consulté

Why is `return nil, err` incorrect in a `defer` function used for error handling in Go?

Go : gérer les paniques avec Defer

Panic and Defer dans Go offre un mécanisme permettant de gérer les erreurs avec élégance et de nettoyer les ressources. Cependant, l'utilisation de defer et panic pour la gestion des erreurs nécessite des éclaircissements.

Considérez le code suivant :

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err // Code 1
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function, which can try to out-of-bound-access a slice
    ...
}
Copier après la connexion

L'intention ici est de renvoyer une erreur si la fonction panique. Cependant, la fonction defer utilise return nil, err (marqué comme Code 1) pour revenir de la fonction actuelle. Ce n'est pas la bonne approche.

Dans une fonction defer, vous pouvez modifier les paramètres renvoyés, mais vous ne pouvez pas renvoyer un nouvel ensemble de valeurs. Pour résoudre ce problème, remplacez le code 1 par :

rep = nil
err = errors.New(r.(string))
return
Copier après la connexion

Cela définit correctement l'erreur et invalide le rapport.

De plus, il est important de noter que la valeur r renvoyée par recovery() est de type interface{}. Dans le code ci-dessus, il s'agit d'un type affirmé en cas d'erreur. Si la valeur de panique n'est pas une erreur, vous devez utiliser une assertion de type plus appropriée ou la gérer comme une panique inconnue.

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