Maison > développement back-end > Golang > Pourquoi `defer recovery()` ne parvient-il pas à attraper la panique, alors que `defer func() { recovery() }()` réussit ?

Pourquoi `defer recovery()` ne parvient-il pas à attraper la panique, alors que `defer func() { recovery() }()` réussit ?

Susan Sarandon
Libérer: 2024-11-30 21:35:17
original
885 Les gens l'ont consulté

Why Does `defer recover()` Fail to Catch Panics, While `defer func() { recover() }()` Succeeds?

Pourquoi différer la récupération() Ne pas attraper la panique ?

La question :

Pourquoi un appel pour différer la fonction ( ) { recovery() }() récupère avec succès une goroutine paniquée, mais un appel pour différer recovery() non ?

La réponse :

Selon la documentation de recovery(), "Si recovery est appelé en dehors de la fonction différée, il sera pas arrêter une séquence de panique."

Dans le cas de defer recovery(), recovery() lui-même est le fonction différée. Par conséquent, il ne s'appelle pas, ce qui entraîne une séquence de panique continue.

Si recovery() devait s'appeler comme fonction différée, elle arrêterait la séquence de panique. Cependant, cela serait illogique.

Une variante intéressante :

Le code suivant évite également la panique :

package main

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

Ici, on crée une variable de récupération avec une valeur de fonction qui appelle la fonction intégrée recovery(). En différant l'appel à la valeur de cette variable, nous invoquons la fonction intégrée recovery(), qui arrête alors 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!

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