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!