Maison  >  Article  >  développement back-end  >  Est-il acceptable de paniquer à l'intérieur d'une fonction de report, surtout lorsqu'elle est déjà paniquée ?

Est-il acceptable de paniquer à l'intérieur d'une fonction de report, surtout lorsqu'elle est déjà paniquée ?

WBOY
WBOYavant
2024-02-11 20:33:08935parcourir

在 defer 函数内部发生恐慌是否可以,特别是当它已经发生恐慌时?

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.

Contenu des questions

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.)

Méthode résolue

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) :

c2e572c1c34a0369ef7​989373914f540

Mê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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer