Maison  >  Article  >  développement back-end  >  Les fonctions de report de Golang peuvent-elles déclencher de nouvelles paniques sans mettre fin à la séquence de panique ?

Les fonctions de report de Golang peuvent-elles déclencher de nouvelles paniques sans mettre fin à la séquence de panique ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 07:08:29366parcourir

Can Golang Defer Functions Trigger New Panics Without Terminating the Panic Sequence?

La panique à l'intérieur d'une fonction de report est-elle acceptable, en particulier lors d'une panique existante ?

Considérez l'extrait de code suivant :

func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}

Lors de l'exécution de cette opération code, il semble que la panique initiale (1) soit remplacée par la deuxième panique (2).

Est-il permis de procéder de cette manière, ou d'invoquer une fonction Golang qui pourrait paniquer dans un fonction de report ?

Oui, c'est acceptable. La panique provoquée par une fonction de report n'est pas une situation nouvelle ou unique ; cela indique simplement que la séquence de panique va continuer.

L'exemple de code fourni démontre cette acceptabilité et illustre comment même un panic() appelé à partir d'une fonction defer peut être intercepté par un appel de niveau "supérieur" à recovery(). .

La spécification Golang indique que si une panique se produit lors de l'exécution de fonctions différées, la séquence de panique ne se terminera pas si la fonction de récupération a exécuté une panique() sans l'attraper.

De plus, toutes les autres fonctions différées seront exécutées même si panic() est appelée dans une fonction différée. Cependant, une panique() sans fonction de récupération dans une fonction defer « enveloppera » la panique existante plutôt que de « l'écraser ».

Par exemple, considérons le code suivant :

func main() {
    defer func() {
        fmt.Println("Checkpoint 1")
        panic(1)
    }()
    defer func() {
        fmt.Println("Checkpoint 2")
        panic(2)
    }()
    panic(999)
}

Sortie :

Checkpoint 2
Checkpoint 1
panic: 999
    panic: 2
    panic: 1

Même si chaque fonction defer appelle panic(), elles sont toutes toujours exécutées et la séquence de panique résultante affiche les valeurs transmises à chaque appel panic().

Lorsque recovery() est appelé dans les fonctions defer, l'impression finale affiche également ces informations « récupérées » :

defer func() {
    recover()
    fmt.Println("Checkpoint 1")
    panic(1)
}()
defer func() {
    recover()
    fmt.Println("Checkpoint 2")
    panic(2)
}()

Sortie :

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