Maison > développement back-end > Golang > Différer `recover()` contre `defer func() { recovery() }()` : Pourquoi l'un récupère-t-il les paniques et l'autre pas ?

Différer `recover()` contre `defer func() { recovery() }()` : Pourquoi l'un récupère-t-il les paniques et l'autre pas ?

DDD
Libérer: 2024-11-29 11:27:10
original
1034 Les gens l'ont consulté

Defer `recover()` vs. `defer func() { recover() }()`: Why Does One Recover Panics and the Other Doesn't?

defer recovery() vs. defer func() { recovery() }()

Q : Pourquoi un appel à defer func () { recovery() }() a réussi à récupérer une goroutine paniquée, alors qu'un appel à différer recovery() ne le fait pas ?

R : Comme indiqué dans la documentation officielle de recovery():

"Si recovery est appelé en dehors de la fonction différée, cela n'arrêtera pas une séquence de panique."

Dans le cas de defer recovery(), recovery() est la fonction différée lui-même. Une fois exécuté, recovery() ne s'appelle pas. Par conséquent, il ne parvient pas à arrêter la séquence de panique.

Si recovery() pouvait s'appeler, cela arrêterait la panique. Cependant, ce scénario n'est pas réalisable.

Considérations supplémentaires :

Le code suivant évite également de paniquer :

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}
Copier après la connexion

Dans ce cas, un La variable nommée recovery de type fonction est créée pour stocker une fonction anonyme qui 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. Cela arrête avec succès la séquence de panique en appelant indirectement la fonction recovery().

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal