Maison > développement back-end > Golang > Pourquoi `defer recovery()` échoue-t-il parfois à récupérer les paniques en Go ?

Pourquoi `defer recovery()` échoue-t-il parfois à récupérer les paniques en Go ?

Barbara Streisand
Libérer: 2024-12-02 17:16:11
original
151 Les gens l'ont consulté

Why Does `defer recover()` Sometimes Fail to Recover Panics in Go?

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")
}
Copier après la connexion

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")
}
Copier après la connexion

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")
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal