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
Susan Sarandonoriginal
2024-11-30 21:35:17886parcourir

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")
}

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!

Déclaration:
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