Go : gérer les paniques avec Defer
Panic and Defer dans Go offre un mécanisme permettant de gérer les erreurs avec élégance et de nettoyer les ressources. Cependant, l'utilisation de defer et panic pour la gestion des erreurs nécessite des éclaircissements.
Considérez le 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 // Code 1 } }() panic("Report format not recognized.") // rest of the getReport function, which can try to out-of-bound-access a slice ... }
L'intention ici est de renvoyer une erreur si la fonction panique. Cependant, la fonction defer utilise return nil, err (marqué comme Code 1) pour revenir de la fonction actuelle. Ce n'est pas la bonne approche.
Dans une fonction defer, vous pouvez modifier les paramètres renvoyés, mais vous ne pouvez pas renvoyer un nouvel ensemble de valeurs. Pour résoudre ce problème, remplacez le code 1 par :
rep = nil err = errors.New(r.(string)) return
Cela définit correctement l'erreur et invalide le rapport.
De plus, il est important de noter que la valeur r renvoyée par recovery() est de type interface{}. Dans le code ci-dessus, il s'agit d'un type affirmé en cas d'erreur. Si la valeur de panique n'est pas une erreur, vous devez utiliser une assertion de type plus appropriée ou la gérer comme une panique inconnue.
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!