Comprendre les limites de defer recovery()
Dans Go, l'utilisation du modèle defer recovery() peut détecter les paniques et empêcher l'arrêt du programme. Cependant, comme le montre l'exemple, un appel direct à defer recovery() ne parvient pas à récupérer en cas de panique. Ce comportement dépend de l'implémentation spécifique de recovery().
Selon la documentation officielle, recovery() ne supprime les paniques que si elle est appelée dans une fonction différée. Lorsqu'il est appelé directement, il ne parvient pas à empêcher la fin du programme. Cette distinction vient du fait que la fonction différée, dans le cas de defer recovery(), est l'appel recovery() lui-même.
Pour illustrer cela, considérons l'exemple suivant :
package main func main() { defer func() { recover() }() // Recoverable panic panic("panic") }
Dans ce scénario, la fonction anonyme sert de fonction différée et l'appel recovery() qu'elle contient réussit à attraper la panique.
Cependant, dans ce qui suit code :
package main func main() { defer recover() // Direct call to recover() panic("panic") }
recover() est appelé directement en tant que fonction différée, ce qui entraîne la panique du programme au lieu de récupérer.
Une variation intéressante
Une variante intéressante à considérer est le code suivant, qui ne panique pas :
package main func main() { var recover = func() { recover() } // Function type variable defer recover() panic("panic") }
Dans cet exemple, nous attribuez une fonction anonyme à une variable nommée recovery. Cette fonction appelle la fonction intégrée recovery(). La fonction différée est ensuite définie pour appeler la valeur de la variable de récupération, appelant effectivement recovery(). En conséquence, la panique est attrapée et le programme continue son exécution.
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!