Erreurs de programmation en Python 3

Comprendre les erreurs est une étape essentielle de l’apprentissage de la programmation. Par contraste avec la présentation d’un algorithme en langage courant, le fait de fixer un langage de programmation impose des contraintes formelles fortes.

Ces contraintes peuvent être perçues comme une gêne, mais on gagne beaucoup à s’appuyer dessus, y compris pour l’enseignement. De plus, le formalisme de la programmation permet souvent au système de signaler des erreurs avant même l’étape du test.

Il faut distinguer différents niveaux d’erreur.

Erreur de syntaxe

Le texte source ne respecte pas la forme imposée par le langage de programmation. Ce n’est donc même pas à proprement parler un programme.

Analogie en math: une réponse « même pas fausse », par exemple Si x<0 donc.

Ce genre d’erreur est détecté immédiatement par l’interpréteur, qui se plaint de ne pas comprendre ce que vous lui voulez.

   1 >>> f(x)=1
   2 SyntaxError: can't assign to function call

On peut parfois regretter que le langage ne soit pas plus flexible, mais la contrainte est parfois salvatrice.

   1 >>> def f(sin(x)): return x
   2 SyntaxError: invalid syntax

Analogie en math: On définit la fonction f : sin(x) ↦ x.

Il faut comprendre la syntaxe comme un contrat, un terrain d’entente minimal: si on le respecte, l’interpréteur s’engage à faire quelque chose.

D’une certaine manière, les erreurs de syntaxe sont donc les plus simples à réparer, parce que le système peut nous indiquer exactement où se trouve le problème: c’est le point où il ne comprend pas ce qu’on lui dit, et c’est en général bien localisé et sans grande complexité.

Une source très courante d’erreurs en Python est le non respect des contraintes d’indentation. Par exemple:

   1 >>> if x==0:
   2 print('zero')
   3 SyntaxError: expected an indented block

ou:

   1 >>>    3
   2 SyntaxError: unexpected indent

Parfois, une ambigüité du langage courant est résolue (d’une manière fixée à l’avance) par le langage de programmation.

Comparer:

  • C’est une conséquence de la négation de la continuité et de la monotonie.

avec:

   1 >>> not False and True
   2 True

Erreur à l’exécution

Ici c’est plus compliqué : le programme est accepté par l’interpréteur, mais c’est lors de son exécution que ça casse.

Les sources sont multiples, et l’interpréteur peut parfois nous aider:

   1 >>> sqrt(2)
   2 Traceback (most recent call last):
   3   File "<pyshell#4>", line 1, in <module>
   4     sqrt(2)
   5 NameError: name 'sqrt' is not defined

   1 >>> ch = 'abc'
   2 >>> print(ch[1],ch[2],ch[3])
   3 Traceback (most recent call last):
   4   File "<pyshell#2>", line 1, in <module>
   5     print(ch[1],ch[2],ch[3])
   6 IndexError: string index out of range

   1 >>> print('le résultat est'+42)
   2 Traceback (most recent call last):
   3   File "<pyshell#0>", line 1, in <module>
   4     print('le résultat est'+42)
   5 TypeError: Can't convert 'int' object to str implicitly

   1 >>> sqrt(-2)
   2 Traceback (most recent call last):
   3   File "<pyshell#10>", line 1, in <module>
   4     math.sqrt(-2)
   5 ValueError: math domain error

Erreur d’algorithmique pure et dure

Là, on est seul face à ses responsabilités:

   1 >>> x=0
   2 >>> n=0
   3 >>> while x<10:
   4         n = n+x

ou encore:

   1 def trouve_lettre(ch,x):
   2    "Renvoie `True` si la lettre `x` est dans la chaîne `ch`."
   3    for y in ch:
   4        if x==y:
   5            return True
   6        else:
   7            return False

Évidemment, ce sont les erreurs les plus intéressantes, celles sur lesquelles on a envie de travailler.

Florilège

En pièces jointes à cette page, vous trouverez des scripts Python inspirés de contributions d’étudiants (de tous niveaux).

  • [get | view] (2017-12-04 22:51:12, 0.2 KB) [[attachment:exemple1_calculette.py]]
  • [get | view] (2017-12-04 22:51:16, 0.3 KB) [[attachment:exemple2_poly.py]]
  • [get | view] (2017-12-04 22:51:19, 1.1 KB) [[attachment:exemple3_triangle.py]]
  • [get | view] (2017-12-04 22:52:21, 0.3 KB) [[attachment:exemple4_damier1.py]]
  • [get | view] (2017-12-04 22:51:25, 0.6 KB) [[attachment:exemple5_damier2.py]]
 All files | Selected Files: delete move to page copy to page

Essayez de voir ce qui cloche dans chaque cas.

EnsInfo: Erreurs (last edited 2019-01-23 08:37:17 by LionelVaux)