Qu'est-ce qu'une erreur d'exécution ?
Une erreur d'exécution est une erreur qui se produit pendant que le programme tourne, quand une opération ne peut pas être réalisée avec les valeurs dont elle dispose, comme diviser par zéro ou lire au-delà de la fin d'une liste. Le programme s'arrête à cette ligne, sauf si l'erreur est gérée.
Mis à jour le 24 septembre 2026
Une erreur d'exécution attend que le programme soit déjà en train de tourner. Le code passe toutes les vérifications avant le démarrage, fonctionne correctement un moment, puis arrive à une opération impossible à réaliser avec les valeurs qu'il a à cet instant. Cette fonction marche pour une liste et échoue pour une autre :
85.0
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(average([]))
^^^^^^^^^^^
File "main.py", line 2, in average
return sum(scores) / len(scores)
~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
Le premier appel affiche 85.0. Le second passe une liste vide, donc len(scores) vaut 0 et la division ne peut pas avoir lieu. La grammaire n'avait rien de faux, donc ce n'est pas une erreur de syntaxe. Le problème n'existe que pour certaines données, et c'est pour cela qu'une erreur d'exécution peut apparaître après qu'un programme a fonctionné correctement cent fois.
Ce qui se passe quand une erreur d'exécution survient
- Le programme arrive à une opération, ici
sum(scores) / len(scores). - Le runtime la vérifie avant de l'effectuer. CPython teste le diviseur avant de diviser, la JVM vérifie chaque index de tableau, et Python vérifie qu'une clé de dictionnaire existe avant de renvoyer sa valeur.
- La vérification échoue, donc le runtime crée un objet d'erreur. En Python et en Java, cet objet est une exception, et il enregistre le type d'erreur, un message et l'endroit où elle s'est produite.
- Le runtime cherche du code qui gère ce type d'erreur, d'abord dans la fonction courante, puis dans la fonction qui l'a appelée, et ainsi de suite vers l'extérieur.
- Si rien ne la gère, le programme s'arrête. Python affiche un traceback et quitte avec le code de sortie 1. Java affiche une stack trace qui commence par
Exception in thread "main".
Les langages sans ces vérifications se comportent autrement. Le C ne vérifie ni les index de tableau ni les pointeurs, donc un mauvais accès mémoire soit corrompt des données en silence, soit pousse le système d'exploitation à terminer le programme avec une segmentation fault.
Tout ce que le programme a fait avant la ligne fautive a déjà eu lieu. Cette boucle affiche trois couleurs avant d'échouer sur la quatrième :
red
green
blue
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(colors[i])
~~~~~~^^^
IndexError: list index out of range
Comment lire un traceback
Lis un traceback Python de bas en haut. La dernière ligne donne le type d'erreur et le message : ZeroDivisionError: division by zero. Les lignes au-dessus listent la chaîne des appels, du plus ancien au plus récent. Dans le premier exemple, la ligne 5 a appelé average, et la ligne 2, dans average, est celle où la division a échoué.
La ligne où l'erreur s'est produite n'est pas toujours celle à modifier. La ligne 2 de average est correcte. La vraie question est de savoir comment une liste vide y est arrivée : remonte la mauvaise valeur jusqu'à son origine et corrige à cet endroit. Quand un traceback traverse des fichiers de bibliothèque que tu n'as pas écrits, cherche la dernière ligne qui pointe vers ton propre fichier.
Erreurs d'exécution courantes
Chacun de ces messages est copié de Python 3.12.
| Erreur | Exemple | Message |
|---|---|---|
ZeroDivisionError | 10 / 0 | division by zero |
IndexError | ["red", "green", "blue"][3] | list index out of range |
KeyError | {"theme": "dark"}["font"] | 'font' |
ValueError | int("twenty") | invalid literal for int() with base 10: 'twenty' |
TypeError | "Total: " + 5 | can only concatenate str (not "int") to str |
AttributeError | appeler .upper() sur None | 'NoneType' object has no attribute 'upper' |
FileNotFoundError | open("missing.txt") | [Errno 2] No such file or directory: 'missing.txt' |
RecursionError | une fonction qui s'appelle elle-même indéfiniment | maximum recursion depth exceeded |
Java a des équivalents directs, comme ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException et NullPointerException. Une division entière par zéro que rien n'intercepte affiche ceci en Java :
Exception in thread "main" java.lang.ArithmeticException: / by zero
JavaScript est plus tolérant avec les nombres : 10 / 0 vaut Infinity, ce n'est pas une erreur. Il échoue quand tu utilises une valeur qui n'est pas là. Node.js affiche ceci pour user.name quand user vaut undefined :
TypeError: Cannot read properties of undefined (reading 'name')
Comment corriger une erreur d'exécution
- Reproduis-la. Relance le programme avec la même entrée et vérifie que tu obtiens la même erreur.
- Lis la dernière ligne du traceback, puis trouve la ligne correspondante dans ton propre code.
- Regarde les valeurs en jeu. Affiche-les juste avant la ligne fautive, ou arrête-toi là avec un point d'arrêt du débogueur.
- Corrige la cause. Rectifie l'index, protège le cas particulier, ou valide l'entrée avant de l'utiliser.
Pour la fonction average, la correction consiste à décider ce que doit valoir la moyenne d'aucune note et à l'écrire dans le code :
85.0
0
Certains échecs échappent à ton contrôle : un fichier qui a été supprimé, un réseau qui dépasse son délai, un utilisateur qui tape des lettres là où il faut un nombre. Tu ne peux pas les empêcher en corrigeant le code, alors tu les interceptes avec la gestion des exceptions et tu décides de la suite. Ce qu'il ne faut pas faire, c'est envelopper un bug dans un try pour le cacher. Un IndexError venant d'une boucle qui compte un pas de trop est une faute à corriger, pas une erreur à intercepter.
Messages d'erreur d'exécution sous Windows et dans Excel
Le terme apparaît aussi en dehors de ton propre code. Une boîte de dialogue Windows intitulée Microsoft Visual C++ Runtime Library avec les mots Runtime Error! signifie qu'un programme écrit en C++ a rencontré une erreur fatale et que le runtime C++ l'a arrêté. En tant qu'utilisateur, tu ne peux pas modifier ce code, donc les remèdes habituels sont de mettre à jour le programme, de réparer ou réinstaller les paquets Microsoft Visual C++ Redistributable et, pour les jeux, de mettre à jour le pilote graphique.
Les macros Excel écrites en VBA signalent des erreurs d'exécution numérotées. Run-time error '9': Subscript out of range signifie que la macro a demandé une feuille de calcul ou un élément de tableau qui n'existe pas, et Run-time error '1004' est une erreur générale levée quand une opération sur un classeur, une feuille ou une plage échoue. L'idée est la même qu'en Python : du code valide a rencontré une valeur qu'il ne savait pas traiter.
Pour aller plus loin
Les erreurs d'exécution ont deux sœurs : l'erreur de syntaxe, détectée avant le démarrage du programme, et l'erreur logique, qui ne produit jamais aucun message. Pour te remettre d'une erreur d'exécution au lieu de planter, lis la gestion des exceptions, puis les guides Python sur les exceptions et le débogage des erreurs. Le cours Python te fait écrire et corriger du code comme celui-ci à chaque leçon.
Questions fréquentes
Quelle est la différence entre une erreur d'exécution et une erreur de syntaxe ?
Pourquoi est-ce que j'ai sans cesse des erreurs d'exécution ?
Que signifie Runtime Error sur LeetCode ?
None, ou une récursion si profonde que la pile déborde. Lance toi-même l'entrée en échec affichée sur la page des résultats, et vérifie les cas limites : un tableau vide, un seul élément, et la plus grande taille autorisée.Une erreur d'exécution est-elle la même chose qu'une exception ?
RuntimeException est aussi le nom d'une famille précise d'exceptions, les exceptions non vérifiées comme NullPointerException.