Lire une erreur, et la corriger
Ce que ce chapitre apporte 5 points
- Lire un message d'erreur et en tirer trois informations : où, quoi, et ce qui était attendu.
- Reconnaître les cinq familles de messages qui arrêtent un organigramme, et l'erreur que le logiciel ne signale pas.
- Corriger une variable non déclarée, un type qui ne convient pas, un indice hors tableau.
- Distinguer une erreur qui arrête le programme d'un résultat faux qui ne dit rien.
- Employer le pas à pas pour voir l'état juste avant l'arrêt.
Un programme peut échouer de deux façons, et elles ne se traitent pas de la même manière. Ou bien il s'arrête en le disant : un message annonce ce qui l'a bloqué, et le travail consiste à lire ce message. Ou bien il va jusqu'au bout et se trompe : rien ne s'affiche en rouge, le résultat est simplement faux, et c'est le sujet du chapitre suivant.
Ce chapitre traite la première famille, celle que tout débutant rencontre dès son deuxième organigramme. Un message d'erreur n'est pas une punition : c'est le seul moment où la machine explique ce qu'elle attendait. Encore faut-il savoir le lire, et surtout savoir où regarder ensuite.
Ce qu'un message contient
Les organigrammes de ces pages s'arrêtent sur les mêmes erreurs que le logiciel. Leurs messages, rédigés pour le site, n'en reprennent pas le mot à mot : sur la page, la forme où l'exécution s'est arrêtée reste surlignée, et le message s'écrit en rouge dans la console. Flowgorithm, lui, surligne la forme fautive, puis ouvre une fenêtre d'erreur qui en nomme la cause, dans la langue choisie pour l'interface. D'un côté comme de l'autre, un message porte trois informations, et ce sont toujours les mêmes.
Où. La forme en cours au moment de l'arrêt se surligne. C'est là qu'il faut regarder, et nulle part ailleurs. Si l'erreur survient dans une fonction, c'est le diagramme de la fonction qui s'affiche.
Quoi. La nature du blocage : une variable inconnue, une valeur du mauvais type, un indice qui sort d'un tableau.
Ce qui était attendu. La partie la plus utile, et la plus souvent ignorée. « Indice 4 hors du tableau debits, dont les cases vont de 0 à 3. » dit exactement quelle borne écrire : 3, et non 4.
Un message se lit en entier, une seule fois. La tentation, devant un message d'erreur, est de le refermer et de relire son dessin. C'est la méthode la plus lente : le message contient déjà la réponse, et le dessin, lui, a l'air juste, sinon il n'aurait pas été fait ainsi. Le logiciel le sait : quand la même erreur revient deux fois sur la même forme, sa fenêtre d'erreur impose cinq secondes d'attente, pour obliger à la lire.
Lire le message, trouver la forme qu'il désigne, corriger, relancer : quatre gestes, dans cet ordre. Les deux derniers se font dans le logiciel, car les organigrammes de cette page s'exécutent mais ne se modifient pas. Ici, chaque figure fautive s'accompagne de sa correction : lire l'arrêt, prévoir la correction, puis la vérifier sur la version corrigée.
Que faire en premier devant un message d'erreur ?
La variable qui n'existe pas
Exécuter : le programme s'arrête sur la première forme. Rien n'a créé « total », et une valeur ne peut pas se ranger dans une case qui n'existe pas.
La page s'arrête sur « La variable total n'est pas déclarée. Une forme Declare doit la créer avant tout usage. » Le logiciel prend cette erreur plus tôt encore : dès qu'on appuie sur Run ou sur Step, un contrôle préalable cherche les variables non déclarées et les formes incomplètes, avant d'exécuter la première forme.
Flowgorithm exige qu'une variable soit créée avant d'être employée, par une forme Declare qui lui donne un nom et un type. C'est la contrainte que Python n'a pas, et c'est une des raisons d'apprendre ici : elle oblige à décider, avant de calculer, ce que chaque valeur représente et dans quel type elle tient.
La même chose, corrigée par une seule forme, la forme Declare. Exécuter : le programme affiche Total : 250.
Deux cousines de cette erreur méritent d'être connues. « La variable … est déjà déclarée » arrive quand un nom est créé deux fois, souvent parce qu'une forme Declare a été recopiée. Et « La variable … est déclarée mais n'a encore reçu aucune valeur » arrive quand on affiche une variable avant de l'avoir remplie : la case existe, elle est vide, et Flowgorithm refuse de deviner ce qu'on voulait y mettre.
Exécuter : la case existe mais elle est vide. Une affectation placée avant l'affichage, mesure = 12.5, suffirait à faire aboutir le programme.
Que signifie « la variable n'est pas déclarée » ?
Le type qui ne convient pas
Un type est une promesse : un Integer ne contient que des entiers, un Real des nombres à virgule, un String du texte, un Boolean vrai ou faux. Une saisie qui trahit cette promesse arrête le programme.
Exécuter avec la saisie proposée, 3.5, dans une variable déclarée Integer : le message dit le type attendu et la valeur reçue. Exécuter à nouveau en saisissant 3 : le programme aboutit.
La page s'arrête sur « colis est un Integer : la saisie « 3.5 » n'est pas un nombre entier. » Déclarer colis en Real ferait aussi taire le message, mais des colis se comptent en entiers : c'est la saisie qui était fausse, pas le type. Le type se choisit d'après ce que la variable contiendra.
La même exigence vaut dans les comparaisons et dans les calculs. Comparer un texte à un nombre n'a pas de sens, et le programme le dit plutôt que d'inventer une réponse. Le cas se produit dès qu'une mesure a été déclarée comme du texte.
Exécuter avec 85 : la saisie a été rangée comme du texte, et un texte ne se compare pas à un nombre.
La page s'arrête sur le losange : « Comparaison impossible entre le texte "85" et le nombre 90. » La vraie correction porte sur la déclaration : un niveau est une mesure, il se déclare Real. La version suivante ne change que cette forme. À défaut, ToReal(niveau) convertirait le texte en nombre avant la comparaison.
La même figure, niveau déclaré Real. Exécuter avec 85 : « Niveau acceptable ».
"Total : " + total échoue parce que + est réservé aux nombres. La concaténation s'écrit avec &, qui accepte les deux.C'est l'erreur la plus commune du parcours, et le message de la page le dit sans détour : « L'opérateur + attend des nombres, et reçoit le texte "Total : ". Pour coller du texte, l'opérateur est &. »
L'indice qui sort du tableau
Exécuter : la boucle va jusqu'à 4, alors que les cases s'arrêtent à l'indice 3. En pas à pas, la fenêtre des variables montre i à 4 quand l'affectation se surligne pour la dernière fois.
Un tableau de quatre cases porte les indices 0, 1, 2 et 3. L'indice 4 n'existe pas, et le message le dit en donnant les bornes réelles : « Indice 4 hors du tableau debits, dont les cases vont de 0 à 3. » C'est l'erreur d'un cran, celle qui se produit à chaque fois qu'on écrit la taille là où il fallait la taille moins un. Avec la borne Size(debits) - 1, la boucle s'arrête à 3.
La borne corrigée. Exécuter : les quatre cases passent à 0, et le programme atteint sa dernière forme.
Un tableau de 6 cases : quel est le plus grand indice valide ?
La division par zéro
Exécuter avec 240 pièces et 0 heure : la division s'arrête net. Exécuter à nouveau en saisissant 8 heures : 30.0 pièces/h. Reste à décider ce que le programme devrait faire d'une durée nulle.
Ce cas mérite mieux qu'une correction de syntaxe. Une durée nulle est une donnée possible, pas une faute de frappe : le programme doit décider quoi en faire, et le seul moyen est de tester avant de diviser.
La version qui tient debout : le cas impossible est traité avant le calcul. Exécuter avec 0 heure, puis avec 8, et vérifier que les deux chemins répondent.
Une division par zéro : que faut-il faire du cas ?
La boucle qui ne s'arrête jamais
Exécuter : rien dans le corps ne fait grandir le volume, donc la condition reste vraie pour toujours. La page interrompt l'exécution au bout de 20 000 formes.
Une boucle While s'arrête quand sa condition devient fausse. Pour qu'elle le devienne, une variable de la condition doit changer dans le corps. Ici rien ne touche au volume : la condition reste vraie, et l'exécution tourne jusqu'à ce que la page l'interrompe, avec un message qui soupçonne la condition de sortie. La mise à jour qui manquait se place dans le corps de la boucle :
La boucle corrigée : volume = volume + debit dans le corps. Exécuter : cinq tours, puis « Cuve pleine : 5000 L ».
Le logiciel, lui, ne s'interrompt pas tout seul : il faut arrêter l'exécution à la main. C'est la seule erreur de ce chapitre qui ne produit pas de message, et c'est pourquoi elle se reconnaît à son symptôme, une console qui se remplit sans fin ou une fenêtre qui ne répond plus.
Une boucle While qui ne s'arrête jamais : où est la faute ?
Les erreurs de fonction
Exécuter : AfficherBilan ne retourne rien, et l'opérateur & n'a donc rien à coller après « Bilan : ».
La page s'arrête sur la sortie : « AfficherBilan ne retourne aucune valeur : elle s'appelle par une forme Call, pas dans une expression. » Une fonction qui ne rend rien ne peut pas figurer dans une expression, puisqu'il n'y a rien à mettre à la place de l'appel ; le logiciel a lui aussi un message propre à ce cas. La correction remplace la sortie par une forme Call, et la procédure affiche elle-même son bilan :
La version corrigée, avec une forme Call. Exécuter : « Presse 2 : 45.0 kWh ».
Deux autres erreurs de la même famille se rencontrent. Une fonction appelée avec le mauvais nombre d'arguments est refusée à l'appel. Une fonction qui se termine sans avoir rangé de valeur dans sa variable de retour arrête le programme à sa pilule de fin, celle qui affiche Return : le chapitre sur les fonctions le montre sur une figure, et le logiciel surligne alors cette pilule en rouge.
Mettre en pratique
Les erreurs d'un cran se comptent, et c'est le meilleur moyen de ne plus les commettre.
Bornes, indices et cas impossibles
- 1.
Un tableau déclaré avec 4 cases porte des indices de 0 à combien ?
- 2.
Une boucle For i = 0 to 4 sur ce tableau prévoit combien de tours ?
- 3.
Combien de tours de trop cette boucle prévoit-elle ?
- 4.
Avec Size(debits) valant 4, quelle borne de fin faut-il écrire ?
- 5.
Un programme lit une durée en heures et divise par elle. Combien de valeurs de durée rendent la division impossible ?
- 6.
Une variable déclarée Integer reçoit la saisie 3.5. Combien de corrections différentes règlent le problème, selon ce que le programme veut représenter ?
Le message dit « L'opérateur + attend des nombres, et reçoit le texte "Total : " ». Où chercher ?
Dans la forme surlignée, et précisément dans l'opérateur que le message nomme. Le cas le plus fréquent est un + employé pour coller un libellé à une valeur : "Total : " + total. La concaténation s'écrit &, qui accepte à la fois du texte et des nombres, et le message de la page le rappelle dans sa dernière phrase.
Le second cas est un texte employé dans un calcul, par exemple une quantité déclarée String : « L'opérateur * attend des nombres, et reçoit le texte "12". » Les fonctions ToInteger et ToReal convertissent alors le texte en nombre, entier ou réel, à condition qu'il en contienne un : ToReal("12.5") rend 12.5. Le plus souvent, la vraie correction est ailleurs : une valeur destinée au calcul se déclare Integer ou Real dès le départ.
Un programme s'arrête au dernier tour d'une boucle seulement. Pourquoi ?
Parce que l'erreur est d'un cran : la boucle va une case trop loin, et les premiers tours se passent bien.
C'est la signature la plus fréquente de l'indice hors tableau. La borne de fin doit valoir la taille moins un, ou Size(tableau) - 1, ce qui reste juste même si la taille change plus tard.
Le pas à pas confirme en une exécution : la fenêtre des variables montre l'indice atteindre la valeur interdite, et la forme se surligne avant de s'arrêter.
Un organigramme s'exécute sans message, et affiche un résultat faux. Que faire ?
Rien de ce chapitre ne s'applique : il n'y a pas de message à lire, donc pas de forme désignée.
C'est l'autre famille d'erreurs, celle de la logique, et elle se traite par le jeu d'essai et le pas à pas : prévoir la valeur de chaque variable, exécuter forme par forme, et chercher la première divergence entre la prévision et l'observation. Le chapitre suivant lui est entièrement consacré.
Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?
Dans la bibliothèque d'exercices
Les cinq familles de messages qui arrêtent un organigramme, la boucle sans fin qu'aucun ne signale, l'erreur d'un cran, et la donnée impossible qui se teste au lieu de se corriger.
- Ce qu'un message d'erreur contientNiveau 1
- L'erreur d'un cranNiveau 2
- La donnée impossible ne se corrige pas, elle se testeNiveau 2