Les messages d'erreurs¶
Comprendre un message d'erreur d'un programme afin de pouvoir la corriger est une compétence importante pour programmer.
Python signale certaines erreurs en estimant leurs positions et leur type.
Voici quelques erreurs classiques, qu'il est bon de connaitre afin de les corriger rapidement.
Les erreurs de syntaxe SyntaxError
¶
Un programme ne peut être interpréter que s'il respecte la syntaxe du langage dans lequel il est écrit. Lorsque la syntaxe de langage Python n'est pas respectée, l'interpréteur s'arrête et affiche une message d'erreur.
Syntaxe a ici le sens de ne respecter la structure du langage.
Nous ne listerons qu'une partie des erreurs qui mènent à ce type d'erreur.
Syntaxe invalide invalid syntax
¶
Il y a trois façons d'obtenir une erreur de ce type:
- Mal orthographier un mot-clé;
- Oublier un mot-clé;
- Mal utiliser ou mal placer un mot-clé.
Exemples
>>> for i range(5):
File "<input>", line 1
for i range(5):
^
SyntaxError: invalid syntax
in
. Le curseur indique le i
situé juste avant l'oublie.
>>> fro i in range(5):
File "<input>", line 1
fro i in range(5):
^
SyntaxError: invalid syntax
for
est mal orthographié. C'est le mot suivant qui est signalé.
>>> for i in range(5)
File "<input>", line 1
for i in range(5)
^
SyntaxError: invalid syntax
:
qui est indispensable à la fin d'une ligne commençant par for
.
>>> if 2 + 2 == 4:
return True
SyntaxError: 'return' outside function
Le mot-clé return
est mal employé ici car il ne peut être utilisé que dans une fonction.
>>> def f(x):
y = x ** 2
return y
SyntaxError: 'return' outside function
return
est mal indenté, ce qui fait qu'il n'est plus dans la fonction. Ce qui explique le message d'erreur.
EOL while scanning string literal
¶
EOF est l'acronyme de End Of Line. Littéralement, ce message signifie que la fin de la ligne est atteinte pendant la lecture d'une chaîne de caractères. Il faut comprendre qu'il manque un délimiteur à la chaîne de caractères.
Exemple
>>>"Bonjour
File "<input>", line 1
"Bonjour
^
SyntaxError: EOL while scanning string literal"Bonjour
cannot assign to function call
¶
Cette erreur signifie que l'on tente d'affecter une valeur lors de l'appel d'une fonction. Cela arrive par exemple lorsque l'on utilise des parenthèses à la place de crochets.
Exemples
>>> tableau = [4, 5]
>>> tableau(1) = 7
File "<input>", line 1
SyntaxError: cannot assign to function call
>>> def f(x):
... return x ** 2
>>> f(4) = 16
File "<input>", line 1
SyntaxError: cannot assign to function call
Il n'est pas possible d'assigner une valeur à l'appel d'une fonction.
Erreur d'indentation IndentationError
¶
Cela signifie que l'indentation est incorrecte. Un bloc peut être pas assez, mal ou trop indenté.
expected an indented block
¶
Un bloc qui devrait être indenté et ne l'est pas. Cela est souvent lorsqu'un bloc suivant une ligne se terminant par unv :
Exemple
>>> for i in range(5):
... print(i)
File "<unknown>", line 2
print(i)
^
IndentationError: expected an indented block>>> for i in range(5):... print(i)
print(i)
pour corriger cette erreur.
unexpected indent
¶
Un bloc est indenté alors qu'il ne le devrait pas.
Exemple
>>> def f(x):
... y = x ** 2
return y
File "<unknown>", line 3
return y
^
IndentationError: unexpected indent
return
est trop indenté.
unindent does not match any outer indentation level
¶
Un bloc ne correspond à aucun niveau d'indentation.
Exemple
>>> for i in range(5):
... print(i)
... print(i * 2)
print(i * 2)
^
IndentationError: unindent does not match any outer indentation level
Erreur de type TypeError
¶
unsupported operand type(s)
¶
Un mélange de type n'est pas compatible avec un opérateur.
Exemple
>>> a = 2
>>> b = "3"
>>> a + b
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
+
ne peut fonctionner entre un entier ete une chaîne de caractères.
takes ... positional arguments but ... were given
¶
Une fonction est appelé avec un nombre d'arguments qui ne correspond pas à sa définition.
Exemple
>>> def min(a,b):
... return a if a < b else b
>>> min(3,4,5)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: min() takes 2 positional arguments but 3 were given
min
a été appelée avec 3 arguments alors qu'elle n'en prend que 2.
Erreur de nom NameError
¶
Une variable est utilisée alors qu'elle n'a pas été initialisée. Cela arrive souvent lors d'une faute de frappe ou de l'oublie d'un pluriel.
Exemple
>>> de1 = 4
>>> de2 = 6
>>> des1 + de2
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'des1' is not defined
des1
n'est pas définie. Il s'agit certainement d'une faute de frappe sur la variable de1
.
Erreur d'index : IndexError
¶
Dans un tableau, une chaîne ou un tuple, on tente d'acceder à un indice qui n'est pas défini. Le plus souvent il s'agit d'un indice trop grand.
Exemples
>>> tab = [4, 5]
>>> tab[2]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
tab
est de longueur 2. Seuls les indices 0 et 1 sont définis. l'indice 2 n'est donc par possible.
>>> tab = [4, 5]
>>> tab[len(tab)]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
tab
est de longueur 2. Seuls les indices 0 et 1 sont définis. l'indice len(tab)
qui est 2 n'est donc par possible.
Source et inspiration: https://www.carnets.info/python/erreurs/