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
Mary-Kate Olsenoriginal
2024-11-12 17:18:01843parcourir

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...
}

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
    }
}()

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!

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