Maison > développement back-end > Golang > Comment gérer les paniques et différer les retours dans les fonctions Go ?

Comment gérer les paniques et différer les retours dans les fonctions Go ?

DDD
Libérer: 2024-11-15 05:35:02
original
428 Les gens l'ont consulté

How to Handle Panics and Defer Returns in Go Functions?

Différer un retour en Go

En Go, l'instruction defer permet de différer l'exécution d'une fonction jusqu'au retour de la fonction environnante. Cela permet d'exécuter des tâches de nettoyage même en cas de panique, ce qui peut se produire lorsque des erreurs irrécupérables se produisent pendant l'exécution.

Considérez l'extrait de code suivant qui tente de renvoyer une erreur d'une fonction en cas de panique :

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.")
    // rest of the getReport function
}
Copier après la connexion

Cependant, ce code ne fonctionne pas comme prévu. L'instruction return dans la fonction différée modifie uniquement les variables locales err et rep dans la fonction et ne les renvoie pas réellement en dehors de la fonction.

Pour résoudre ce problème, nous pouvons utiliser la fonction recovery à l'intérieur de la fonction différée pour récupérez la valeur de panique et définissez le paramètre err en conséquence. De plus, nous devons vérifier le type de valeur de panique et la convertir en erreur si nécessaire.

Voici un code mis à jour :

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

Ce code garantit que le paramètre err est défini sur l'erreur appropriée en fonction de la valeur de panique, et cela invalide également le paramètre rep pour éviter de renvoyer un rapport incomplet.

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