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 doneExemple 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 doneExplication
Dans cet exemple corrigé, recovery() est maintenant dans la goroutine handle(), afin qu'il puisse capturer la panique déclenché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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3