Le concept d'erreur
Fait partie de la section Fondamentaux du Journey GO de Coddy — leçon 102 sur 109.
En Go, les erreurs sont des valeurs qui indiquent que quelque chose s'est mal passé. Go gère les erreurs de manière explicite plutôt que d'utiliser des exceptions.
Créons une fonction qui pourrait produire une erreur lors de la division de nombres :
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Cette fonction retourne deux valeurs : le résultat de la division et une erreur potentielle. Si le diviseur est égal à zéro, nous retournons un message d'erreur au lieu de tenter la division.
Maintenant, utilisons notre fonction et gérons les erreurs potentielles :
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Après l'exécution de ce code, nous verrons un message d'erreur à l'écran car nous avons essayé de diviser par zéro :
Error: cannot divide by zeroCeci illustre le modèle de gestion des erreurs de Go : vérifier si une erreur s'est produite (err != nil), puis prendre les mesures appropriées. Si aucune erreur ne s'est produite, nous pouvons utiliser le résultat en toute sécurité.
Défi
FacileDans ce défi, vous allez vous entraîner à manipuler les erreurs en Go. Vous allez créer une fonction qui divise deux nombres et renvoie une erreur si une division par zéro est tentée.
Votre tâche consiste à :
- Compléter la fonction
dividequi prend deux entiers et renvoie leur quotient et une erreur. - Si le diviseur est zéro, renvoyez 0 et une erreur avec le message "division by zero".
- Si la division est valide, renvoyez le résultat et
nilpour l'erreur. - Dans la fonction
main, appelezdivideavec les valeurs fournies et gérez les erreurs de manière appropriée.
Cet exercice démontre comment les fonctions Go renvoient couramment un résultat et une erreur, et comment vérifier et gérer ces erreurs.
Aide-mémoire
En Go, les erreurs sont des valeurs qui indiquent que quelque chose s'est mal passé. Go gère les erreurs de manière explicite plutôt que d'utiliser des exceptions.
Les fonctions susceptibles d'échouer retournent deux valeurs : le résultat et une erreur potentielle :
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Pour gérer les erreurs, vérifiez si l'erreur n'est pas nil :
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Utilisez errors.New() pour créer de nouveaux messages d'erreur et retournez nil lorsqu'aucune erreur ne se produit.
Essayez vous-même
package main
import (
"errors"
"fmt"
)
// divide divise a par b et retourne le résultat
// Si b est égal à 0, elle retourne une erreur
func divide(a, b int) (int, error) {
// TODO: Implémenter la fonction divide
// Si b est égal à 0, retourner 0 et une erreur avec le message "division by zero"
// Sinon, retourner a/b et nil pour l'erreur
}
func main() {
// Premier cas de test
a, b := 10, 2
result, err := divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
// Deuxième cas de test
a, b = 8, 0
result, err = divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
4Opérateurs de comparaison et logiques
Opérateurs de comparaison - Partie 1Opérateurs de comparaison - Partie 2Opérateur logique ANDOpérateur logique OROpérateur logique NOTBases de la priorité des opérateursRécapitulatif - Effectuer des comparaisons7Structures de contrôle : Les boucles
Explication de la boucle `for`Boucle For - Les basesBoucle For - Condition uniquementLe mot-clé `break`Le mot-clé `continue`Boucles imbriquéesRécapitulatif - Répéter des actions2Variables et types de données de base
Qu'est-ce qu'une variableInférence de type avec `:=` Entiers (int)Nombres à virgule flottanteBooléensChaînes de caractères (Strings)Valeurs zéroConstantesConventions de nommageRécapitulatif - Variables et types5Entrées/Sorties de base
Sortie formatéeVerbes de formatageAffichage des typesSaisie utilisateur de baseRécapitulatif - Entrées et Sorties8Fonctions
Comprendre les fonctionsDéclarer une fonctionAppeler des fonctionsParamètres de fonctionRetourner une valeur uniqueRetourner plusieurs valeursValeurs de retour nomméesBases de la portée des fonctionsRécapitulatif - Créer du code réutilisable11Types composites : Slices
Introduction aux SlicesDéclaration de littéraux de SlicesCréation de Slices avec `make`Longueur vs Capacité des SlicesAccès aux éléments d'un SliceAjout d'élémentsDécoupage de Slices/Tableaux existantsItération sur les SlicesCopie de SlicesRécapitulatif - Listes dynamiques14Gestion de base des erreurs
Le concept d'erreurL'interface `error`Fonctions retournant des erreursVérification des erreursCréation d'erreurs simplesCréation d'erreurs formatéesGestion de base des erreursRécapitulatif - Gérer les problèmes3Opérateurs de base
Opérateurs arithmétiquesOpérateur de divisionL'opérateur moduloOpérateur d'affectationOpérateurs d'affectation augmentéeIncrémentation et décrémentationRécapitulatif - Calculs6Structure de contrôle : Les conditionnelles
L'instruction `if`Le mot-clé `else`Le mot-clé `else if`Masquage de variable dans `if`Initialisation des variablesL'instruction `switch``switch` avec expressions`switch` sans expressionLe mot-clé `fallthrough`Récapitulatif - Prendre des décisions9Pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de variables pointeursL'opérateur d'adresseDéréférencement de pointeursUtiliser des pointeurs dans les fonctionsPointeurs NilRécapitulatif - Comprendre les pointeurs12Types composites : Maps
Introduction aux MapsDéclaration de littéraux de MapCréation de Maps avec `make`Ajout et mise à jour de paires clé-valeurAccès aux valeurs d'une MapVérification de l'existence d'une cléSuppression d'entrées de MapTaille d'une MapItération sur les MapsRécapitulatif - Stockage clé-valeur