Gérer les paniques dans les routines Go
Lorsqu'une panique survient dans une routine Go, il est essentiel de la gérer correctement. L'utilisation de la fonction de récupération peut récupérer efficacement la valeur de panique et la gérer en conséquence.
Une approche courante consiste à gérer les paniques dans la fonction principale à l'aide de fonctions différées. Cependant, lorsque la panique se produit dans une goroutine distincte, cette approche ne parvient pas à la capturer.
Dans l'exemple donné :
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
La panique se produit dans la fonction handle au sein de la goroutine, mais la fonction de récupération différée dans la fonction principale ne peut pas la capturer. En effet, recovery ne fonctionne que lorsqu'il est invoqué dans la même goroutine d'où la panique est originaire.
Pour résoudre ce problème, déplacez l'appel de la fonction de récupération différée dans la fonction handle :
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }
Avec ceci modification, lorsqu'une panique survient dans la fonction handle, la fonction de récupération différée au sein de la même goroutine l'attrapera et la traitera en conséquence.
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!