Maison >développement back-end >Golang >Pourquoi `defer recovery()` n'attrape-t-il pas la panique dans Go ?

Pourquoi `defer recovery()` n'attrape-t-il pas la panique dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 02:08:09889parcourir

Why Doesn't `defer recover()` Catch Panics in Go?

Quand est-ce que defer recovery() ne parvient pas à attraper la panique ?

Dans Go, les fonctions defer sont exécutées dans l'ordre inverse de leur déclaration lorsqu'un la fonction revient normalement ou panique. Alors que defer func() { recovery() }() récupère efficacement des paniques, il n'en va pas de même pour defer recovery().

Ce comportement découle de la documentation de recovery(), qui indique que "si recovery est appelé en dehors de la fonction différée, il n'arrêtera pas une séquence de panique." Dans le cas de defer recovery(), recovery lui-même est la fonction différée et ne s'appelle donc pas.

Exemple :

Considérez le code suivant :

package main

func main() {
    defer recover()
    panic("panic")
}

Ce code va en effet paniquer avec le message "panic: panic", indiquant que defer recovery() n'a pas empêché le panique.

Exemple de travail :

En revanche, le code suivant récupère avec succès de la panique :

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}

Dans ce cas, l'anonyme La fonction est appelée lorsque la fonction principale revient ou panique. Dans cette fonction anonyme, recovery() est appelé, capturant et empêchant avec succès la panique.

Exemple exceptionnel :

Fait intéressant, le code suivant évite également la panique :

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}

Ici, la variable de fonction recovery contient une référence à la fonction anonyme qui appelle la fonction recovery() intégrée. Spécifier cette variable comme fonction différée appelle effectivement la fonction recovery() intégrée, mettant ainsi fin à la 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