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 }
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!
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 }
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
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 :
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!