Maison > développement back-end > Golang > En quoi le comportement de « recover() » diffère-t-il entre les fonctions différées imbriquées et non imbriquées dans Go ?

En quoi le comportement de « recover() » diffère-t-il entre les fonctions différées imbriquées et non imbriquées dans Go ?

Susan Sarandon
Libérer: 2024-11-23 04:24:16
original
1030 Les gens l'ont consulté

How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?

Comprendre les limitations de recovery() dans les fonctions différées imbriquées

Dans Golang, panic et recovery fournissent des mécanismes de gestion des erreurs et de récupération. Bien que recovery() aide à gérer les paniques en renvoyant la valeur de panique, son comportement change dans les fonctions différées imbriquées.

Exemple 1 : fonction différée simple

Considérez l'extrait de code suivant :

package main

import "fmt"

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

func main() {
    defer printRecover()

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

Ce code panique avec "OMG!" et récupère avec succès la valeur de panique à l'aide de la fonction différée printRecover(), comme en témoigne le résultat :

Recovered: OMG!
Copier après la connexion

Exemple 2 : fonction différée imbriquée

Maintenant, passons enveloppez printRecover() dans une autre fonction différée :

package main

import "fmt"

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

func main() {
    defer func() {
        printRecover()
    }()

    panic("OMG!") // Panic goes unrecoverable
}
Copier après la connexion

Dans cet exemple, la panique va irrécupérable, et le programme panique avec le message :

Recovered: <nil>
panic: OMG!

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

Comprendre la différence

La différence entre ces deux exemples réside dans la manière dont recovery() est appelé. Selon la spécification Golang :

  • recover() renvoie nil s'il n'est pas appelé directement par une fonction différée.

Dans l'exemple 1, printRecover() est directement appelé par un fonction différée, qui lui permet de renvoyer la valeur de panique. Cependant, dans l'exemple 2, printRecover() est appelée par une fonction anonyme qui est ensuite différée. Cela fait que recovery() renvoie nil car il n'est pas directement appelé par une fonction différée.

Par conséquent, pour réussir à récupérer une panique dans une fonction différée imbriquée, recovery() doit être appelé directement à partir d'une fonction différée.

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