Programmation en Go/Panic et recover

Lorsqu'une erreur survient dans un appel de fonction, le meilleur comportement est en général de signaler l'erreur par un code retour. Mais parfois une erreur est irréversible et doit entraîner l'arrêt du programme. Dans ce cas, il convient d'appeler la fonction panic(). Cette fonction prend un seul argument de type quelconque.

Exemple:

 var user = os.Getenv("USER")
 
 func init() {
    if user == "" {
        // le programme se termine abruptement
        panic("pas de valeur pour $USER")
    }
 }

Recover

modifier

Cette fonction permet de récupérer une exception lancée par "panic". Elle s'utilise en général avec defer:

 func serveur(canal <-chan *Tache) {
    for tache := range canal {
        go faitEnSecurite(tache)
    }
 }
 
 func faitEnSecurite(tache *Tache) {
    defer func() {
        if err := recover(); err != nil {
            log.Println("tache echouee:", err)
        }
    }()
    faire(tache)
 }

Ici, la fonction "faitEnSecurite" applique au résultat de "faire()" la fonction déclarée avec defer, qui appelle recover() et vérifie si une erreur a eu lieu. L'exception est à ce moment totalement levée et il n'y a rien d'autre à faire pour continuer l'exécution normale du programme.