Maison >développement back-end >Golang >Pourquoi `recover()` renvoie-t-il `nil` dans les fonctions différées imbriquées dans Go ?

Pourquoi `recover()` renvoie-t-il `nil` dans les fonctions différées imbriquées dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-24 06:56:091057parcourir

Why Does `recover()` Return `nil` in Nested Deferred Functions in Go?

Comportement de Recover() dans les fonctions différées imbriquées

Dans Go, panic() et recovery() sont utilisés pour gérer les erreurs d'exécution . Cependant, les erreurs récupérables doivent être gérées par des fonctions différées.

Cas simple :

Dans un scénario simple de fonction différée, recovery() fonctionne comme prévu :

package main

import "fmt"

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

func main() {
    defer printRecover()
    panic("OMG!")
}

Cas différé imbriqué :

Lorsque printRecover() est enveloppé dans une fonction différée imbriquée :

func main() {
    defer func() {
        printRecover()
    }()
    panic("OMG!")
}

le comportement change. recovery() dans printRecover() renvoie zéro. En effet :

Selon la spécification Go :

La valeur de retour de recovery() est nulle si recovery() n'a pas été appelée directement par une fonction différée.

Dans le cas imbriqué, printRecover() est appelée par la fonction différée imbriquée, et non directement par la fonction initiale un.

Conclusion :

Pour que recovery() fonctionne dans des fonctions différées imbriquées, elle doit être appelée directement par la fonction différée qui gère la panique. Lorsque cette condition n'est pas remplie, recovery() retournera nul.

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