Gérer les erreurs
15 min · Intermédiaire · 3 octobre 2026
Les erreurs comme valeurs ordinaires
import (
"errors"
"fmt"
)
func diviser(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division par zero impossible")
}
return a / b, nil
}
resultat, err := diviser(10, 0)
if err != nil {
fmt.Println("Erreur :", err)
} else {
fmt.Println("Resultat :", resultat)
} if err != nil est le motif le plus répété de tout code Go : on vérifie systématiquement l’erreur juste après chaque appel qui pourrait en produire une, avant de continuer.
Attention
Ignorer une erreur retournée (en écrivant resultat, _ := diviser(10, 0)) fait disparaître silencieusement le signal d’échec. C’est une pratique à éviter, sauf cas vraiment justifié.
Créer une erreur avec plus de contexte
func verifierAge(age int) error {
if age < 0 {
return fmt.Errorf("age invalide : %d (doit etre positif)", age)
}
return nil
}
if err := verifierAge(-5); err != nil {
fmt.Println(err) // "age invalide : -5 (doit etre positif)"
} fmt.Errorf fonctionne comme fmt.Sprintf, mais produit directement une valeur error formatée, pratique pour inclure des détails utiles au diagnostic.
panic et recover : les cas vraiment exceptionnels
func diviserOuPaniquer(a, b int) int {
if b == 0 {
panic("division par zero : situation anormale")
}
return a / b
}
func executerEnSecurite() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recupere apres panique :", r)
}
}()
fmt.Println(diviserOuPaniquer(10, 0))
}
executerEnSecurite()
// "Recupere apres panique : division par zero : situation anormale" defer programme l’exécution d’une fonction juste avant que la fonction englobante ne se termine, qu’elle se termine normalement ou via un panic. recover() à l’intérieur d’un defer intercepte une panique en cours, empêchant l’arrêt complet du programme.
Info
En pratique, panic/recover reste rare dans du code Go idiomatique : la grande majorité des erreurs prévisibles se gèrent avec des valeurs error classiques, pas avec panic.
À toi de jouer
func diviserEnSecurite(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division par zero impossible")
}
return a / b, nil
}
resultat, err := diviserEnSecurite(10, 0)
if err != nil {
fmt.Println("echec")
} else {
fmt.Println(resultat)
}