Menu
Coddy logo textTech

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.

Par Kevin Spektor, Cofondateur et CTO

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

  1. Le programme arrive à une opération, ici sum(scores) / len(scores).
  2. 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.
  3. 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.
  4. 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.
  5. 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.

ErreurExempleMessage
ZeroDivisionError10 / 0division by zero
IndexError["red", "green", "blue"][3]list index out of range
KeyError{"theme": "dark"}["font"]'font'
ValueErrorint("twenty")invalid literal for int() with base 10: 'twenty'
TypeError"Total: " + 5can only concatenate str (not "int") to str
AttributeErrorappeler .upper() sur None'NoneType' object has no attribute 'upper'
FileNotFoundErroropen("missing.txt")[Errno 2] No such file or directory: 'missing.txt'
RecursionErrorune fonction qui s'appelle elle-même indéfinimentmaximum 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

  1. Reproduis-la. Relance le programme avec la même entrée et vérifie que tu obtiens la même erreur.
  2. Lis la dernière ligne du traceback, puis trouve la ligne correspondante dans ton propre code.
  3. 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.
  4. 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 ?
Une erreur de syntaxe est détectée avant le démarrage du programme, parce que le code enfreint la grammaire du langage, donc aucune ligne ne s'exécute. Une erreur d'exécution arrive plus tard, pendant que le programme tourne, quand une ligne valide rencontre une valeur qu'elle ne sait pas traiter. Toutes les lignes précédentes se sont déjà exécutées et ont peut-être affiché quelque chose.
Pourquoi est-ce que j'ai sans cesse des erreurs d'exécution ?
En général parce que le code suppose sur ses données quelque chose qui n'est pas toujours vrai : qu'une liste n'est jamais vide, qu'un fichier existe, que l'utilisateur tape un nombre. Chaque supposition marche pour les entrées que tu as testées et échoue pour une que tu n'as pas testée. Teste avec des entrées vides, nulles, absentes et très grandes, et vérifie ou gère ces cas explicitement.
Que signifie Runtime Error sur LeetCode ?
Cela veut dire que ta solution a compilé mais a planté sur au moins un cas de test. Les causes habituelles sont un index hors limites, une division par zéro, l'utilisation d'une valeur null ou 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 ?
Pas tout à fait. En Python et en Java, la plupart des erreurs d'exécution sont signalées sous forme d'exceptions, ce qui permet au programme de les intercepter. Mais des langages comme le C ont des erreurs d'exécution et aucune exception. En Java, RuntimeException est aussi le nom d'une famille précise d'exceptions, les exceptions non vérifiées comme NullPointerException.
Un compilateur peut-il détecter les erreurs d'exécution ?
Seulement certaines. Un compilateur ou un vérificateur de types comme mypy peut prouver que certaines fautes sont impossibles, par exemple additionner du texte et un nombre. Mais il ne peut pas connaître les valeurs qui arrivent pendant l'exécution, comme un nombre tapé par l'utilisateur qui se révèle être zéro. Ces erreurs ne se trouvent qu'en exécutant le code, ou se gèrent en vérifiant l'entrée.
Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER