Comment une fonction d'appelant se remet-elle des paniques de l'enfant Goroutine ?
Auparavant, on supposait qu'une panique dans une goroutine mettrait fin au programme si son appelant a terminé avant que la panique ne se produise. Cependant, l'expérimentation avec un exemple de code a révélé le contraire.
Exemple de code :
<code class="go">func fun1() { fmt.Println("fun1 started") defer func() { if err := recover(); err != nil { fmt.Println("recover in func1") } }() go fun2() time.Sleep(10 * time.Second) // wait for the boom! fmt.Println("fun1 ended") } func fun2() { fmt.Println("fun2 started") time.Sleep(5 * time.Second) panic("fun2 booom!") fmt.Println("fun2 ended") }</code>
Comportement inattendu :
Malgré dans l'attente que le mécanisme de récupération de la fonction appelante gèrerait la panique de la goroutine, le programme entier s'est toujours terminé.
Explication :
La spécification Go indique que :
Lorsque fun2 est la fonction de niveau supérieur exécutée dans la goroutine et que fun2 ne se remet pas d'une panique, le programme se termine lorsque fun2 panique.
Puisque fun2 est la fonction de niveau supérieur dans sa goroutine et c'est le cas. Si vous ne gérez pas la panique, le programme se termine prématurément.
Autonomie des goroutines :
Une goroutine ne peut pas se remettre d'une panique dans une autre goroutine. Par conséquent, l'appel différé dans fun1 n'est pas invoqué lorsque fun2 panique.
Conclusion :
Une fonction appelante ne peut pas récupérer des paniques dans les goroutines qu'elle crée à moins que la goroutine ne récupère explicitement de la panique avant la fin de l'appelant du programme.
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!