Maison > développement back-end > Golang > le corps du texte

Pourquoi le « defer » imbriqué ne parvient-il pas à récupérer les paniques dans Go ?

Linda Hamilton
Libérer: 2024-11-23 10:33:12
original
430 Les gens l'ont consulté

Why Does Nested `defer` Fail to Recover Panics in Go?

Dévoilement des raisons derrière la récupération inefficace dans les fonctions différées imbriquées

Dans Golang, recovery() sert de mécanisme crucial pour gérer les exceptions et empêcher la propagation des paniques. Cependant, une observation intrigante se produit lors de l’utilisation de recovery() dans des fonctions différées imbriquées. Contrairement aux attentes, des paniques peuvent encore survenir malgré la présence de reports imbriqués.

Pour illustrer cette anomalie, considérons le code suivant :

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    // Direct deferred call to recover()
    defer printRecover()

    panic("OMG!")
}
Copier après la connexion

Une fois exécuté, ce code fonctionne comme prévu :

Recovered: OMG!
Copier après la connexion

Cependant, lorsque nous enfermons printRecover() dans un fichier différé imbriqué function :

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    // Nested deferred call to recover()
    defer func() {
        printRecover()
    }()

    panic("OMG!")
}
Copier après la connexion

Le résultat change :

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60
Copier après la connexion

L'écart provient du comportement unique de recovery(). Conformément à la spécification Go, recovery() :

  • Renvoie nul si :

    • L'argument de panique était nul
    • La goroutine n'est pas panicing
    • recover() n'a pas été appelé directement par un différé function

Dans le cas différé imbriqué, recovery() n'a pas été invoqué directement par la fonction différée la plus externe mais par celle imbriquée. Par conséquent, il renvoie zéro, laissant la panique non gérée.

Cette distinction cruciale souligne l'importance d'utiliser recovery() directement dans les fonctions différées pour assurer une récupération de panique efficace dans Golang.

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