Leçon 4 / 15

Repérer les erreurs possibles dans les dépenses

25 min Python — modules, erreurs et données Gratuit

Objectif : Distinguer les principales catégories d’erreurs Python et lire un traceback pour localiser un problème dans le suivi de dépenses.

Un total de dépenses peut être faux parce que le programme ne démarre pas, parce qu’une opération échoue pendant son exécution ou parce qu’un calcul produit un résultat incorrect sans interrompre le programme. Ces situations demandent des diagnostics différents. Vous allez apprendre à les reconnaître et à utiliser le traceback pour remonter jusqu’à l’origine d’un échec.

Trois catégories à distinguer

Une erreur de syntaxe signifie que Python ne peut pas analyser le code : par exemple, une parenthèse n’est pas fermée ou un deux-points manque après une instruction. Le programme s’arrête avant d’exécuter son traitement. Pour illustrer ce cas tout en gardant un programme exécutable, le code suivant demande à Python d’analyser un texte contenant une erreur de syntaxe.

Texte
code_invalide = "total = (42.80 + 18.50"

try:
    compile(code_invalide, "calcul.py", "exec")
except SyntaxError as erreur:
    print(f"Erreur de syntaxe dans {erreur.filename} : ligne {erreur.lineno}")
    print(erreur.msg)
Résultat attendu
Erreur de syntaxe dans calcul.py : ligne 1
'(' was never closed

Ici, compile analyse le texte sans l’exécuter. L’erreur est capturée uniquement pour que la démonstration affiche son diagnostic ; vous ne mettez pas encore en place le traitement des erreurs dans l’application. Dans un fichier Python ordinaire, cette erreur empêcherait le lancement du module concerné.

Une erreur d’exécution apparaît une fois le programme lancé, lorsqu’une opération ne peut pas aboutir. Dans un suivi de dépenses, diviser par zéro pour calculer une moyenne en est un exemple. Python interrompt alors le programme et affiche un traceback, c’est-à-dire le compte rendu de l’échec et des appels de fonctions qui l’ont précédé.

Texte
def moyenne_depenses(transactions):
    total = sum(transaction["montant"] for transaction in transactions)
    return total / len(transactions)


def afficher_moyenne(transactions):
    moyenne = moyenne_depenses(transactions)
    print(f"Moyenne : {moyenne:.2f} EUR")


transactions = []
afficher_moyenne(transactions)
Résultat attendu
Traceback (most recent call last):
  File "depenses/main.py", line 12, in <module>
    afficher_moyenne(transactions)
  File "depenses/main.py", line 7, in afficher_moyenne
    moyenne = moyenne_depenses(transactions)
  File "depenses/main.py", line 3, in moyenne_depenses
    return total / len(transactions)
ZeroDivisionError: division by zero

La dernière ligne du traceback nomme l’exception et résume la cause : ZeroDivisionError, division par zéro. Pour localiser la ligne concernée, partez de cette fin et remontez dans les lignes qui la précèdent. On voit que afficher_moyenne appelle moyenne_depenses, qui effectue la division ; les lignes décrivent la pile d’appels, du point d’entrée jusqu’à l’opération fautive.

Une erreur de logique est plus discrète : le code est valide et s’exécute, mais le résultat ne correspond pas à l’intention. Dans cet exemple, la fonction additionne le montant deux fois pour chaque transaction. Python ne signale aucun problème ; c’est la comparaison avec le total attendu qui permet de détecter l’erreur.

Texte
def total_depenses(transactions):
    total = 0.0
    for transaction in transactions:
        total += transaction["montant"] * 2
    return total


transactions = [
    {"montant": 42.80},
    {"montant": 18.50},
]
print(f"Total calculé : {total_depenses(transactions):.2f} EUR")
Résultat attendu
Total calculé : 122.60 EUR

Pour ces transactions, le total attendu est 61.30 EUR, et non 122.60 EUR. Le programme a terminé sans erreur d’exécution : le défaut se trouve dans la règle de calcul, ici le facteur * 2. Vérifiez les résultats obtenus à partir de données connues, notamment après avoir modifié une fonction métier comme total_depenses, déjà présentée dans la leçon sur les modules.

Diagnostiquer sans masquer le problème

Quand le programme échoue, conservez le traceback complet : le nom du fichier et le numéro de ligne orientent la recherche, tandis que les appels précédents montrent le chemin suivi. Reproduisez ensuite le cas avec les mêmes données. Si le programme ne plante pas mais affiche un résultat suspect, calculez le résultat attendu séparément et comparez-le à celui affiché.

Ne supprimez pas un message d’erreur simplement pour obtenir une sortie propre : vous perdriez l’information nécessaire au diagnostic. Dans les prochaines leçons, vous apprendrez à signaler explicitement une donnée invalide puis à intercepter certaines exceptions au niveau approprié. Pour l’instant, l’objectif est d’identifier la nature du problème avant de choisir comment le traiter.

À retenir

  • Une erreur de syntaxe empêche Python d’analyser le code ; une erreur d’exécution survient pendant son traitement.
  • Une erreur de logique produit un résultat incorrect sans nécessairement interrompre le programme.
  • Dans un traceback, l’exception apparaît à la fin ; les lignes précédentes décrivent la pile d’appels.
  • Pour diagnostiquer, reliez le message, le fichier, la ligne et les données utilisées.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.