Gestion des paniques dans les routines Go
Go fournit les fonctions intégrées panic() et recovery() pour gérer les erreurs inattendues et les conditions fatales dans code en cours d'exécution. Pour gérer les paniques dans une routine Go, il est essentiel de comprendre la portée de recovery().
Comprendre la portée de recovery()
recover() ne peut récupérer que des paniques au sein du même goroutine qui a semé la panique. Si une panique se produit dans une goroutine sans recovery() actif, l'ensemble du programme plantera.
Exemple avec une gestion incorrecte des erreurs
L'exemple de code fourni dans la question ne parvient pas à gérer une panique car recovery() est défini dans la routine principale, tandis que la panique est déclenchée dans la goroutine handle(). Par conséquent, recovery() ne peut pas accéder à la valeur de panique.
func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here done <- *a // Dereferencing nil pointer }
Exemple de gestion correcte des erreurs
Pour gérer les paniques déclenchées dans une goroutine, placez le recovery () dans la goroutine elle-même.
func main() { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() go handle(done) // ... } func handle(done chan int64) { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() fmt.Println(*a) // Panic here done <- *a // Dereferencing nil pointer }
Explication
Dans cet exemple corrigé, recovery() est maintenant dans la goroutine handle(), il peut donc capturer la panique suscitée par le déréférencement du pointeur nul. La panique est ensuite récupérée et le message « Récupéré » est imprimé.
Comprendre la portée de recovery() est crucial pour une gestion efficace des erreurs dans les routines Go. Placez toujours recovery() dans la même goroutine où la panique pourrait survenir pour gérer et signaler avec élégance toute condition inattendue.
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!