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
DDDoriginal
2024-11-15 05:35:02431parcourir

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
}

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

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!

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