cybercursus

Gérer les erreurs

15 min · Intermédiaire · 3 octobre 2026

Sommaire
  1. Les erreurs comme valeurs ordinaires
  2. Créer une erreur avec plus de contexte
  3. panic et recover : les cas vraiment exceptionnels
  4. À toi de jouer

Les erreurs comme valeurs ordinaires

go
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

go
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

go
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

go
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)
}
Que produit ce code à l'exécution ?
Pourquoi Go n'a-t-il pas de mécanisme try/catch comme Java ou Python pour gérer les erreurs courantes ?
Quelle est la différence entre une erreur normale (valeur de type error) et un panic en Go ?

Pour aller plus loin

Commentaires

Recherche