Maison >développement back-end >Golang >Go Panic Recovery : différer `recover()` – Quelle est la différence ?
Différer recovery() vs. defer recovery()
Dans Go, une panique peut être détectée et gérée à l'aide de la fonction recovery() . Cependant, il est important de noter que le placement de defer par rapport à l'appel recovery() a des implications significatives.
Scénario A : defer func() { recovery() }()
Dans ce scénario, l'instruction defer planifie qu'une fonction anonyme soit exécutée à la fin de la fonction en cours. Lorsque cette fonction est exécutée, elle appelle la fonction recovery(). Il s'agit d'un moyen efficace de détecter et de gérer les paniques car la fonction recovery() sera exécutée même si une panique se produit avant que la fonction englobante ne reprenne l'exécution.
Scénario B : différer la récupération()
Dans ce scénario, la fonction recovery() elle-même est planifiée comme fonction différée. Cependant, cela ne fonctionne pas comme prévu car recovery() ne s'appelle pas. Par conséquent, toute panique qui se produit avant que la fonction englobante ne reprenne l'exécution ne sera pas interceptée par cet appel différé.
Ce comportement est documenté dans la documentation Go : "Si recovery est appelé en dehors de la fonction différée, il n'arrêtera pas un séquence de panique."
Un exemple intéressant : defer (func() { recovery() })()
Pour illustrer cela davantage, considérons le code suivant :
var recover = func() { recover() } defer recover() panic("panic")
Étonnamment, ce code ne panique pas non plus. Dans ce cas, nous créons une variable de récupération de type fonction et l'initialisons avec une fonction anonyme qui appelle la fonction recovery() intégrée. Nous spécifions ensuite la valeur de la variable de récupération comme fonction différée. Cela nous permet d'attraper et de gérer la panique car la fonction différée appelle efficacement recovery(), arrêtant ainsi la séquence de panique.
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!