Gestion des erreurs en Go : try/catch et au-delà — guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à la gestion des erreurs en Go



Go (Golang) est un langage compilé moderne développé chez Google. L'une de ses caractéristiques clés est son approche de la gestion des erreurs, qui diffère radicalement du mécanisme familier try/catch de Java, Python ou JavaScript. Go n'a pas d'exceptions au sens classique. Au lieu de cela, le langage utilise un transfert explicite et "manuel" des erreurs via les valeurs de retour. Cette approche peut sembler inconfortable pour les débutants, mais elle rend le code plus prévisible, lisible et résistant aux bugs cachés.



Dans cet article, nous allons détailler la philosophie de la gestion des erreurs en Go : de l'interface de base error aux mécanismes panic et recover. Vous apprendrez pourquoi Go a abandonné try/catch et comment écrire du code fiable sans crash soudains.



Pourquoi Go n'a-t-il pas de try/catch ?



Les développeurs de Go (Rob Pike, Ken Thompson et Robert Griesemer) ont délibérément renoncé aux exceptions. Les principales raisons :



  • Explicité : Une erreur est simplement une valeur que la fonction retourne explicitement. Le programmeur voit toujours que la fonction peut se terminer avec une erreur.
  • Flux d'exécution non encombré : Dans les langages avec exceptions, le code "saute" souvent dans un bloc catch, perturbant la linéarité. En Go, le flux d'exécution reste prévisible.
  • Absence d'erreurs cachées : Les exceptions peuvent ne pas être interceptées, ce qui entraîne un crash. En Go, vous êtes obligé de gérer l'erreur (ou de l'ignorer explicitement via _).


Au lieu de try/catch, Go propose un idiome simple mais puissant :



result, err := doSomething()if err != nil {    // Gestion de l'erreur    log.Fatal(err)}// Travail avec result


Ce modèle est omniprésent en Go. Il ne nécessite pas de constructions spéciales et fait de la gestion des erreurs une partie du flux de code normal.



L'interface error et la création d'erreurs personnalisées



L'interface error intégrée



En Go, les erreurs implémentent l'interface intégrée :



type error interface {    Error() string}


Tout type qui a une méthode Error() string satisfait automatiquement cette interface. La fonction standard errors.New() crée une erreur simple :



import "errors"

err := errors.New("quelque chose s'est mal passé")fmt.Println(err.Error()) // "quelque chose s'est mal passé"


Création de types d'erreurs personnalisés



Pour des informations détaillées, on crée des structures personnalisées :



type MyError struct {    Code    int    Message string}

func (e *MyError) Error() string { return fmt.Sprintf("erreur %d: %s", e.Code, e.Message)}

func riskyOperation() error { return &MyError{Code: 404, Message: "non trouvé"}}

func main() { err := riskyOperation() if err != nil { // type assertion pour obtenir les détails if myErr, ok := err.(*MyError); ok { fmt.Printf("Code : %d, Message : %s", myErr.Code, myErr.Message) } }}


Cela permet de transmettre avec l'erreur toutes les données supplémentaires : statuts HTTP, codes d'erreur, horodatages, etc.



Travail avec panic et recover



Bien que Go évite les exceptions, il dispose d'un mécanisme panic pour les situations critiques (par exemple, dépassement de limites de tableau ou division par zéro). panic n'est pas un remplacement de try/catch, mais un interrupteur d'urgence.



Quand utiliser panic ?

  • Pour des états inattendus qui ne peuvent pas être gérés (par exemple, une erreur dans l'initialisation du programme).
  • Dans les tests et prototypes (mais pas dans le code de production sans nécessité absolue).


Le mécanisme recover



recover() permet d'"attraper" une panique et de continuer l'exécution. Il ne fonctionne qu'à l'intérieur d'une fonction différée (defer) :





                
                

Blogs

Book Recommendations