Recherche…


Remarques

Cet article suppose la connaissance de Defer Basics

Pour la gestion des erreurs ordinaires, lisez la rubrique sur la gestion des erreurs

Panique

Une panique interrompt le flux d'exécution normal et quitte la fonction en cours. Tous les appels différés seront alors exécutés avant que le contrôle ne soit transmis à la fonction suivante de la pile. La fonction de chaque pile sortira et lancera des appels différés jusqu'à ce que la panique soit gérée à l'aide d'une recover() différée recover() ou jusqu'à ce que la panique atteigne main() et termine le programme. Si cela se produit, l'argument fourni à paniquer et une trace de pile seront imprimés sur stderr .

package main

import "fmt"

func foo() {
    defer fmt.Println("Exiting foo")
    panic("bar")
}

func main() {
    defer fmt.Println("Exiting main")
    foo()
}

Sortie:

Exiting foo
Exiting main
panic: bar


goroutine 1 [running]:
panic(0x128360, 0x1040a130)
    /usr/local/go/src/runtime/panic.go:481 +0x700
main.foo()
    /tmp/sandbox550159908/main.go:7 +0x160
main.main()
    /tmp/sandbox550159908/main.go:12 +0x120

Il est important de noter que la panic acceptera tout type comme paramètre.

Récupérer

Récupérer comme son nom l'indique peut tenter de se remettre d'une panic . La récupération doit être tentée dans une instruction différée car le flux d'exécution normal a été arrêté. L'instruction de recover doit apparaître directement dans l'enceinte de la fonction différée. Les instructions de récupération dans les fonctions appelées par des appels de fonctions différés ne seront pas honorées. L'appel recover() renverra l'argument fourni à la panique initiale, si le programme est en train de paniquer. Si le programme n'est pas en train de paniquer, recover() renverra nil .

package main

import "fmt"

func foo() {
    panic("bar")
}

func bar() {
    defer func() {
        if msg := recover(); msg != nil {
            fmt.Printf("Recovered with message %s\n", msg)
        }
    }()
    foo()
    fmt.Println("Never gets executed")
}

func main() {
    fmt.Println("Entering main")
    bar()
    fmt.Println("Exiting main the normal way")
}

Sortie:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow