Qu'est-ce qu'une erreur logique ?
Une erreur logique est une faute dans le raisonnement d'un programme qui lui fait produire un mauvais résultat sans planter ni afficher de message d'erreur. Le code est valide et chaque ligne s'exécute, mais il ne fait pas ce que le programmeur voulait.
Mis à jour le 24 septembre 2026
Trois notes, 80, 90 et 100, ont une moyenne de 90. Ce programme s'exécute sans la moindre plainte et affiche autre chose :
Average: 203.33333333333334
Python a fait exactement ce que dit la ligne. La division passe avant l'addition, donc seule la dernière note a été divisée par 3, et le résultat est 80 + 90 + 33,33. Le programmeur voulait écrire (scores[0] + scores[1] + scores[2]) / 3. Ajoute les parenthèses et le programme affiche Average: 90.0.
Pourquoi aucun message d'erreur n'apparaît
Un ordinateur vérifie si le code est valide, pas s'il est correct. Le parseur vérifie la grammaire, ce qui attrape une erreur de syntaxe. Le runtime vérifie chaque opération, ce qui attrape une erreur d'exécution comme une division par zéro. Additionner trois nombres et diviser l'un d'eux par 3 est une grammaire valide et une opération légale, donc les deux vérifications passent.
Seule la personne qui a écrit le programme sait qu'il devait calculer une moyenne. Cette intention n'existe nulle part dans le code, donc aucun outil ne peut comparer le résultat avec elle. Une erreur logique, c'est l'écart entre ce que tu as dit à l'ordinateur de faire et ce que tu voulais qu'il fasse.
Causes courantes des erreurs logiques
La plupart des erreurs logiques viennent d'une courte liste de schémas.
- Les erreurs de décalage d'un (off-by-one). Une boucle tourne une fois de trop ou une fois de moins.
range(1, 5)produit 1, 2, 3 et 4, car la borne de fin est exclue. Voir l'itération. - La priorité des opérateurs.
a + b / 2ne divise queb, comme dans la moyenne ci-dessus. - La mauvaise comparaison.
<là où il fallait<=, ouandlà où il fallaitor. Les conditions sont des expressions booléennes, et un seul mauvais opérateur inverse le résultat pour certaines entrées. - Des conditions dans le mauvais ordre. Dans une chaîne
ifetelif, la première condition vraie l'emporte, donc un test large placé en premier masque les tests plus précis en dessous. - La mauvaise variable. Mettre à jour
totaldans une boucle mais affichersubtotal. - Des suppositions sur les nombres.
0.1 + 0.2 == 0.3vautFalseen Python, Java et JavaScript, car les nombres à virgule flottante sont des approximations.7 // 2vaut 3, pas 3,5.
Voici l'erreur d'ordre des conditions. Une note de 95 devrait donner un A :
D
D
F
95 est supérieur ou égal à 60, donc la première branche l'emporte et le elif n'est jamais atteint. Place le seuil le plus élevé en premier et chaque résultat devient juste.
Les types d'erreurs en programmation
Les erreurs de programmation sont généralement classées en trois types, selon le moment où elles apparaissent et ce qui les signale.
| Erreur de syntaxe | Erreur d'exécution | Erreur logique | |
|---|---|---|---|
| Quand elle apparaît | Avant l'exécution du programme | Pendant l'exécution | Pendant l'exécution, ou jamais remarquée |
| Ce qui la détecte | Le parseur ou le compilateur | Le runtime ou le système d'exploitation | Une personne ou un test |
| Le programme s'exécute-t-il ? | Non | Jusqu'à la ligne fautive | Oui, jusqu'au bout |
| Message d'erreur | Oui, avec un numéro de ligne | Oui, avec un traceback | Aucun |
| Exemple en Python | if x > 3 sans le deux-points | 10 / 0 | a + b / 2 pour une moyenne |
| Comment la trouver | Lire le message | Lire le traceback | Comparer la sortie avec une réponse connue |
Certains manuels listent plus de types, et la plupart entrent dans ces trois-là. Une erreur de type que le compilateur Java rejette, comme incompatible types: String cannot be converted to int, est détectée à la compilation comme une erreur de syntaxe, et certains livres l'appellent erreur sémantique. Une erreur d'édition de liens se produit à la dernière étape de la construction d'un programme C ou C++, quand une fonction a été déclarée mais que son code est introuvable. Les erreurs arithmétiques, de ressources et de fichiers, comme diviser par zéro, manquer de mémoire ou ouvrir un fichier absent, sont toutes des erreurs d'exécution. Le terme « erreur sémantique » est aussi employé par certains cours comme autre nom de l'erreur logique, alors vérifie quel sens utilise ton manuel.
Comment trouver une erreur logique
- Teste avec une réponse que tu connais déjà. Calcule le bon résultat à la main pour une petite entrée, puis compare. Trois notes sont plus faciles à vérifier que trois mille.
- Affiche les valeurs intermédiaires. Afficher
scoreet la branche prise, ou le compteur de boucle à chaque passage, montre l'étape exacte où la réalité s'écarte de ton plan. - Avance pas à pas avec un débogueur. Poser un point d'arrêt et exécuter une ligne à la fois fait la même chose sans modifier le code.
- Teste les limites. Essaie 0, 1, la plus grande valeur, une liste vide, et le seuil exact (60 et 90 dans l'exemple des notes).
- Explique le code à voix haute. Décrire chaque ligne à quelqu'un d'autre, ou à un canard en plastique, t'oblige à dire ce que fait la ligne plutôt que ce que tu supposes qu'elle fait.
Un assert transforme une réponse connue en vérification automatique. Il ne fait rien quand la condition est vraie et arrête le programme quand elle est fausse :
Traceback (most recent call last):
File "main.py", line 10, in <module>
assert grade(95) == "A", "95 should be an A"
^^^^^^^^^^^^^^^^
AssertionError: 95 should be an A
Un test qui échoue transforme une erreur logique silencieuse en erreur bruyante, avec un numéro de ligne. C'est toute l'idée des tests unitaires.
Les erreurs logiques dans d'autres langages
Les schémas sont les mêmes partout, mais chaque langage a ses propres pièges. En JavaScript, "5" + 3 est la chaîne "53", alors que "5" - 3 est le nombre 2, donc une valeur lue sous forme de texte depuis un formulaire peut s'additionner de travers sans aucune erreur. En C, if (x = 5) affecte 5 à x et est toujours vrai. Clang le signale par défaut (using the result of an assignment as a condition without parentheses), mais le code compile et s'exécute quand même, alors prends les avertissements du compilateur aussi au sérieux que les erreurs.
Pour aller plus loin
Compare cette page avec celles sur l'erreur de syntaxe et l'erreur d'exécution pour voir comment chaque type est signalé. Les boucles sont le terrain des erreurs de décalage d'un, donc la page sur l'itération et le guide Python sur les boucles for sont de bonnes lectures pour la suite. Pour t'entraîner à trouver des résultats faux dans de vrais exercices, essaie le cours Python.
Questions fréquentes
Quelle est la différence entre une erreur de syntaxe et une erreur logique ?
Qu'est-ce qu'une erreur logique en Python ?
range(1, 5) quand tu voulais de 1 à 5 inclus, a + b / 2 quand tu voulais (a + b) / 2, et des branches if testées dans le mauvais ordre. Python ne peut pas les détecter, car il n'a aucun moyen de savoir ce que tu voulais dire.