Est-ce que cela aura un impact en cas de panique à l'intérieur de la fonction de report ? C'est une question courante, surtout en cas de situation de panique. En PHP, la fonction defer est utilisée pour effectuer certaines opérations de nettoyage avant le retour de la fonction actuelle. En cas de panique, le programme arrêtera immédiatement l'exécution et toutes les fonctions de report seront exécutées dans l'ordre du dernier entré, premier sorti. Par conséquent, même après une panique, la fonction de report sera toujours exécutée. Ceci est utile pour gérer des tâches telles que la libération des ressources et la gestion des erreurs. Quoi qu'il arrive, la fonction defer s'exécute toujours de manière fiable, garantissant l'intégrité et la stabilité du code.
func sub(){ defer func (){ panic(2) }() panic(1) } func main(){ defer func(){ x:=recover() println(x.(int)); }() sub() }
J'ai essayé ce code et il semble que la première panique panic(1)
被第二个恐慌 panic(2)
« remplace ».
Mais est-ce que c'est bien de faire ça ? Ou appeler une fonction Golang qui pourrait paniquer dans une fonction de report ?
(En C++, lancer une exception à partir d'un destructeur est presque inacceptable. Si la pile a été déroulée, cela mettra fin au programme. Je me demande si paniquer de la même manière serait mauvais en Golang.)
Oui , C'est bon. La panique provoquée par la fonction de retard n'est pas vraiment un nouvel état spécial, cela signifie simplement que la séquence de panique ne s'arrêtera pas.
Votre exemple de code prouve également que tout va bien, même l'appel "supérieur" de panic()
称为可以通过对 recover()
pour arrêter la fonction de retard.
Normes : Gestion de la panique :
Une chose à noter ici est que même si vous appelez l'appel panic()
,所有其他延迟函数仍然会运行。另外,来自延迟函数的没有 recover()
的 panic()
宁愿“包装”现有的恐慌,而不是“覆盖”它(尽管 recover()
调用确实只会返回传递给最后一次 panic()
dans une fonction différée).
Voir cet exemple :
func main() { defer func() { fmt.Println("Checkpoint 1") panic(1) }() defer func() { fmt.Println("Checkpoint 2") panic(2) }() panic(999) }
Sortie (essayez-le sur Go Playground) :
c2e572c1c34a0369ef7989373914f540Même si toutes les fonctions différées sont appelées panic()
,所有延迟函数都会执行,并且打印的最终恐慌序列包含传递给所有 panic()
la valeur de l'appel.
Si vous appelez recover()
à l'intérieur d'une fonction de délai, vous obtiendrez également ce statut ou ce message "récupéré" dans l'impression finale :
defer func() { recover() fmt.Println("Checkpoint 1") panic(1) }() defer func() { recover() fmt.Println("Checkpoint 2") panic(2) }()
Sortie (essayez-le sur Go Playground) :
Checkpoint 2 Checkpoint 1 panic: 999 [recovered] panic: 2 [recovered] panic: 1 ...
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!