Maison > développement back-end > Golang > Les instructions Defer peuvent-elles être utilisées pour manipuler les valeurs de retour dans les fonctions paniquées ?

Les instructions Defer peuvent-elles être utilisées pour manipuler les valeurs de retour dans les fonctions paniquées ?

Mary-Kate Olsen
Libérer: 2024-11-12 17:18:01
original
822 Les gens l'ont consulté

Can Defer Statements Be Used to Manipulate Return Values in Panicked Functions?

Manipulation des valeurs de retour avec Defer

Dans Go, l'instruction defer peut être utilisée pour exécuter une fonction après le retour de la fonction environnante. Ce mécanisme vous permet de gérer des tâches de nettoyage ou d'effectuer des actions même si une erreur se produit. Cependant, il existe une limitation lorsque vous tentez de renvoyer une valeur d'erreur à partir d'une fonction qui panique et est enfermée dans une instruction defer.

Considérez l'extrait de 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
        }
    }()
    panic("Report format not recognized.")
    // Remaining function code...
}
Copier après la connexion

L'intention est pour renvoyer une erreur si la fonction getReport panique. Cependant, cette approche ne fonctionne pas car les fonctions defer ne peuvent pas modifier le nombre de valeurs de retour dans la fonction environnante. Au lieu de cela, ils ne peuvent modifier que les valeurs des paramètres de retour existants.

Pour résoudre ce problème, la fonction defer doit modifier le paramètre de retour err au lieu d'essayer de renvoyer une nouvelle valeur d'erreur :

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // Find out the exact error type and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        // Invalidate rep
        rep = nil
    }
}()
Copier après la connexion

Avec cette modification, la fonction defer met à jour le paramètre err return et définit rep sur nil pour indiquer une condition d'erreur. Cela permet à la fonction environnante de renvoyer la valeur d'erreur modifiée.

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