En tant que programmeur, vous êtes amené à rencontrer des erreurs lors du développement d’un logiciel. Il peut s’agir d’erreurs de logique conduisant à des résultats inattendus, d’erreurs résultant de la violation des règles d’un langage de programmation, voire d’erreurs survenant lors de l’exécution de votre programme, parmi bien d’autres. Ces erreurs sont communément appelées “bogues”.
Les bogues sont omniprésents dans tous les langages de programmation, quelle que soit la facilité d’apprentissage ou d’utilisation du langage.
En Python, par exemple, bien que le langage mette l’accent sur la lisibilité, suive une syntaxe expressive et soit considéré comme relativement facile à apprendre et à utiliser par rapport à d’autres langages de programmation, vous n’êtes toujours pas à l’abri d’erreurs de programmation lorsque vous utilisez Python.
Comme les erreurs sont inévitables, une bonne façon de les gérer est d’apprendre à connaître les différents types d’erreurs qui peuvent se produire et comment elles se produisent. Cela vous permettra d’éviter ou de minimiser ces erreurs lors de la programmation et de savoir comment les gérer lorsqu’elles surviennent.
Voici quelques-unes des erreurs Python courantes que vous pouvez rencontrer en programmant avec ce langage :
Erreurs de syntaxe
Une erreur de syntaxe est une erreur qui survient lorsque vous écrivez un code qui viole les règles du langage de programmation que vous utilisez. Il en résulte une ligne de code invalide.
En Python, par exemple, lorsque vous imprimez une chaîne de caractères, celle-ci doit être placée entre guillemets. Si vous ne le faites pas, vous obtenez une erreur de syntaxe.
Une erreur de syntaxe peut également survenir lorsque vous omettez des parenthèses ouvrantes ou fermantes, des crochets ou des accolades, lorsque vous orthographiez mal des mots-clés ou des noms de fonctions, lorsque vous omettez des deux-points à la fin d’instructions de contrôle de flux ou lorsque vous omettez des opérateurs requis dans des expressions.
En général, les erreurs de syntaxe surviennent si vous ne respectez pas une règle sur la façon dont le code Python doit être écrit.
## erreur de syntaxe due à l'absence de guillemets
## autour de la chaîne imprimée
print("Hello World)
age = 20
## Erreur de syntaxe due à l'absence de deux points dans une instruction if
if age > 18
print("L'âge est supérieur à 18")
## Erreur de syntaxe car '(' n'a jamais été fermé
def square(x :
return x * x
print(square(4))
En exécutant le code ci-dessus, vous obtiendrez le message d’erreur suivant :
Le message d’erreur de l’exécution du code est le suivant :
File "/home/madici/Desktop/helloworld.py", line 1
print("Hello World)
^
SyntaxError : unterminated string literal (detected at line 1)
Pour résoudre ces erreurs, utilisez la bonne syntaxe Python comme indiqué ci-dessous :
print("Hello World")
age = 20
si age > 18 :
print("L'âge est supérieur à 18")
def square(x) :
return x * x
print(square(4))
Erreur d’indentation
Contrairement à d’autres langages comme Java, C ou C , qui utilisent des accolades pour séparer les blocs de code, Python utilise l’indentation pour définir la hiérarchie et la structure des blocs de code. Par exemple, lorsque vous écrivez des instructions de contrôle en Java, tout le code à exécuter une fois que la condition a été évaluée est contenu à l’intérieur des accolades.
En revanche, en Python, le bloc de code est indenté. Une indentation typique en Python consiste en quatre espaces ou une tabulation. Toutefois, le nombre d’espaces n’a pas d’importance tant qu’il reste cohérent tout au long du code écrit.
En tant que programmeur Python, vous êtes susceptible de rencontrer des erreurs d’indentation lorsque vous n’ajoutez pas l’indentation requise, par exemple lors de l’écriture d’instructions de contrôle ou de fonctions, lorsque vous utilisez à la fois des tabulations et des espaces pour créer des indentations car cela perturbe l’interpréteur, lorsque vous placez des indentations au mauvais endroit ou lorsque vos indentations ne sont pas cohérentes dans l’ensemble de votre base de code.
Vous trouverez ci-dessous un exemple de code entraînant une erreur d’indentation :
age = 20
si âge > 18 :
print("L'âge est supérieur à 18")
print("Vous êtes autorisé à conduire")
else :
print("L'âge est inférieur à 18")
Les messages d’erreur résultant du code ci-dessus sont présentés ci-dessous :
Le message d’erreur résultant de l’exécution du code est le suivant :
File "/home/madici/Desktop/helloworld.py", line 3
print("L'âge est supérieur à 18")
^
IndentationError : expected an indented block after 'if' statement on line 2
Pour corriger les erreurs, mettez en retrait la ligne après l’instruction if , car un retrait est nécessaire, et assurez-vous qu’il correspond à l’indentation du reste du code, comme indiqué ci-dessous :
age = 20
if age > 18 :
print("L'âge est supérieur à 18")
print("Vous êtes autorisé à conduire")
else :
print("L'âge est inférieur à 18")
TypeError
En Python, une TypeError est une exception qui survient lorsque vous essayez d’effectuer une opération en utilisant un type de données incompatible. Par exemple, si vous essayez d’additionner une chaîne de caractères et un entier ou de concaténer une chaîne de caractères avec un entier, vous rencontrerez une TypeError.
Vous pouvez également rencontrer des TypeError lorsque vous utilisez des fonctions ou des méthodes avec des types de données incorrects, lorsque vous essayez d’utiliser un index non entier pour accéder à des éléments dans un itérable tel qu’une liste, ou lorsque vous essayez d’itérer à travers un objet qui ne peut pas être itérable.
En règle générale, toute opération utilisant un type de données incorrect entraîne une erreur de type (TypeError).
Vous trouverez ci-dessous des exemples d’opérations pouvant entraîner des TypeError :
# Erreur de type résultant de la concaténation d'une chaîne de caractères et d'un entier
age = 25
message = "Je suis " age " ans."
list1 = [1, "hello", 5, "world", 18, 2021]
#Erreurs de type résultant d'une mauvaise utilisation des méthodes intégrées (builtin in)
print(sum(list1))
#TypeError résultant de l'addition d'une chaîne de caractères et d'un entier
num1 = 10
num2 = "16"
print(num1 num2)
#TypeError résultant de l'utilisation d'un index non entier
list2 = ["hello", "from", "the", "other", "side"]
print(list2["1"])
Les messages d’erreur résultant du code ci-dessus sont présentés ci-dessous :
Un exemple de message TypeError provenant du code est présenté ci-dessous :
File "/home/madici/Desktop/helloworld.py", line 3, in <module>
message = "Je suis " âge " ans."
~~~~~~~~^~~~~
TypeError : can only concatenate str (not "int") to str
Pour supprimer les erreurs, utilisez les types de données corrects ou les conversions de type comme indiqué ci-dessous :
age = 25
message = "Je suis " str(age) " âgé de 25 ans."
list1 = [1, 5, 18, 2021]
print(sum(list1))
num1 = 10
num2 = "16"
print(num1 int(num2))
list2 = ["hello", "from", "the", "other", "side"]
print(list2[1])
Erreur d’attribut
En Python, une AttributeError se produit lorsque vous essayez d’utiliser un attribut qui n’existe pas sur l’objet ou d’appeler une méthode qui n’existe pas sur l’objet sur lequel elle est appelée. Une AttributeError indique qu’un objet n’a pas d’attribut ou de méthode sur lequel il est appelé.
Par exemple, si vous appelez une méthode string sur un entier, vous rencontrerez une AttributeError car la méthode n’existe pas sur le type d’objet sur lequel vous l’appelez.
Dans l’exemple ci-dessous, la méthode capitalize(), qui est utilisée pour convertir la première lettre d’une chaîne en majuscule, est appelée sur un entier. Le résultat est une erreur d’attribut car int ne possède pas la méthode capitalize().
# AttributeError résultant de l'appel à capitalize() sur une valeur int
num = 1445
cap = num.capitalize()
print(cap)
L’exécution de ce code entraîne le message d’erreur ci-dessous :
Le message AttributeError du code est le suivant :
File "/home/madici/Desktop/helloworld.py", line 3, in <module>
cap = num.capitalize()
^^^^^^^^^^^^^^
AttributeError : l'objet 'int' n'a pas d'attribut 'capitalize'
Pour résoudre une AttributeError, assurez-vous que la méthode ou l’attribut que vous appelez existe sur le type d’objet sur lequel vous l’appelez. Dans ce cas, l’appel de capitalize() sur un type de données string résout l’erreur comme indiqué ci-dessous :
Erreur d’importation
L’erreur d’importation en Python se produit lorsque vous essayez d’importer un module qui ne peut pas être trouvé ou qui n’est pas accessible dans votre environnement actuel. Il se peut qu’il ne soit pas encore installé, que vous n’ayez pas configuré son chemin correctement ou que vous ayez mal orthographié le module que vous essayez d’installer.
Une ImportError a une seule sous-classe enfant appelée ModuleNotFoundError qui est l’erreur qui est levée lorsque vous essayez d’importer un module qui ne peut pas être trouvé.
Par exemple, le code ci-dessous, qui tente d’importer la bibliothèque d’analyse de données pandas, génère une telle erreur car le module n’est pas encore installé.
Le message ImportError généré est illustré ci-dessous :
File "/home/madici/Desktop/helloworld.py", line 1, in <module>
import pandas
ModuleNotFoundError : Aucun module nommé 'pandas'
Pour résoudre une telle erreur, assurez-vous que les modules que vous essayez d’importer ont été installés. Si cela ne résout pas l’erreur, vérifiez si vous utilisez la bonne orthographe pour le module et le bon chemin d’accès au module.
Erreur de valeur
Il s’agit d’une exception qui se produit lorsqu’une fonction Python reçoit une valeur du bon type de données, mais que cette valeur n’est pas appropriée. Par exemple, la fonction Math.sqrt() utilisée pour trouver la racine carrée de valeurs numériques renverra une ValueError si vous transmettez un nombre négatif.
Même si la valeur est du bon type, c’est-à-dire une valeur numérique, le fait qu’elle soit négative en fait une valeur inappropriée pour la fonction Math.sqrt()
La fonction int( ), qui convertit un nombre ou une chaîne de caractères, renvoie une ValueError si vous transmettez une chaîne de caractères qui n’est pas une valeur numérique. Si vous passez “123” ou “45” à la fonction, celle-ci ne renvoie pas d’erreur, car les chaînes peuvent être converties en valeurs entières appropriées.
Cependant, si vous passez une chaîne qui n’est pas une valeur numérique, telle que “Hello”, la fonction renvoie une ValueError. En effet, “Hello”, bien qu’il s’agisse d’une chaîne de caractères, n’est pas approprié car il n’a pas d’équivalent en nombres entiers.
Vous trouverez ci-dessous un exemple de code générant une ValueError :
# Erreur de valeur résultant d'une valeur int inappropriée dans sqrt()
import math
num = -64
root = math.sqrt(num)
print(root)
# Erreur de valeur résultant du passage d'une chaîne de caractères sans entier
# équivalent dans la fonction int()
numString = "Hello"
num = int(numString)
print(num)
Les erreurs du code ci-dessus sont illustrées ci-dessous :
Le message d’erreur généré est le suivant :
File "/home/madici/Desktop/helloworld.py", line 4, in <module>
root = math.sqrt(num)
^^^^^^^^^^^^^^
ValueError : erreur de domaine mathématique
Pour corriger l’erreur, utilisez les valeurs appropriées dans les fonctions comme indiqué ci-dessous :
import math
num = 64
root = math.sqrt(num)
print(racine)
numString = "5231"
num = int(numString)
print(num)
Erreur IO
L’erreur IOError (erreur d’entrée/sortie) est une exception qui se produit lorsqu’une opération d’entrée ou de sortie échoue. Cela peut être dû à une tentative d’accès à un fichier qui n’existe pas, à un espace disque insuffisant sur votre périphérique, à une tentative d’accès à un fichier pour lequel vous ne disposez pas des autorisations suffisantes ou à une tentative d’accès à un fichier en cours d’utilisation par d’autres opérations.
Les méthodes telles que open(), read(), write( ) et close() , qui sont généralement utilisées lorsque vous travaillez avec des fichiers, sont celles qui sont susceptibles de provoquer une telle erreur.
Considérez le code ci-dessous qui tente d’ouvrir un fichier appelé “notes.txt” qui n’existe pas. Le code génère une erreur IOError qui soulève l’erreur FileNotFoundError :
Avec le message d’erreur suivant :
File "/home/madici/Desktop/helloworld.py", line 2, in <module>
file1 = open("notes.txt", "r")
^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError : [Errno 2] No such file or directory : 'notes.txt'
Pour éviter l’erreur ci-dessus, il vous suffit de vous assurer que le fichier “notes.txt” existe dans le répertoire dans lequel vous exécutez le terminal. Une autre façon de gérer les erreurs IOError est d’utiliser le bloc try except , comme illustré ci-dessous :
NameError
L’erreur de nom est une exception que vous rencontrez lorsque vous essayez d’utiliser une variable, une fonction ou un module qui n’existe pas, qui n’est pas défini dans le champ d’application actuel ou auquel aucune valeur n’a été attribuée.
Ce type d’erreur survient généralement lorsque les noms de variables ou de fonctions sont mal orthographiés ou qu’ils sont utilisés avant d’être définis. L’utilisation d’un module sans l’importer entraîne également une NameError.
Le code suivant entraîne une exception de type NameError :
# l'erreur de nom provient du fait que le module mathématique n'a pas été importé
num = 64
root = math.sqrt(64)
print(root)
# NameError car x est utilisé avant d'être défini
y = 23
print(x)
#NameEror car le nom de la fonction n'est pas défini
def greet() :
print("Bonjour")
great() #ameError : le nom 'great' n'est pas défini
Les messages d’erreur suivants résultent du code ci-dessus :
Un exemple de message NameError est présenté ci-dessous :
File "/home/madici/Desktop/helloworld.py", line 3, in <module>
root = math.sqrt(64)
^^^^
NameError : le nom 'math' n'est pas défini
Pour résoudre une telle NameError, assurez-vous que vous n’utilisez pas de modules avant de les importer, que vous n’utilisez pas de variables ou de fonctions avant de les définir, et que vous ne faites pas de fautes d’orthographe dans les noms de fonctions ou de variables :
import math
num = 64
root = math.sqrt(64)
print(racine)
y = 23
print(y)
def greet() :
print("Bonjour")
greet()
Erreur d’index
Une IndexError est une exception qui se produit lorsque vous essayez d’accéder à un index d’une liste ou d’un tuple qui est hors de portée. Considérez la liste ci-dessous :
list1 = [1, 2, 3, 4, 5]
La liste comporte cinq éléments. Python compte les index à partir de 0 (zéro). Par conséquent, la liste ci-dessus a des index allant de 0 à n-1, n étant le nombre d’éléments de la liste. Dans ce cas, l’index de la liste sera compris entre 0 et 4.
Si vous essayez d’accéder à un élément dont l’index est supérieur à 4, vous rencontrerez une erreur d’index (IndexError) car l’index n’est pas compris dans la liste à partir de laquelle vous essayez d’accéder à un élément. Le code ci-dessous génère une erreur d’index :
list1 = [1, 2, 3, 4, 5]
item = list1<x>[6]</x> #IndexError parce que l'index de la liste est hors limites
print(item)
L’erreur du code est illustrée ci-dessous :
Le message IndexError généré est le suivant :
File "/home/madici/Desktop/helloworld.py", line 2, in <module>
item = list1<x>[6]</x> #IndexError car l'index de la liste est hors plage
~~~~~^^^
IndexError : l'index de la liste est hors de portée
La meilleure façon d’éviter une IndexError est d’utiliser les fonctions range() et len() pour s’assurer que vous n’accédez qu’aux éléments qui se trouvent dans l’intervalle, comme dans l’exemple suivant :
list1 = [1, 2, 3, 4, 5]
for i in range(len(list1)) :
print(list1[i])
Erreur de clé
Une KeyError est une exception qui se produit lorsque vous essayez d’accéder à un élément d’un dictionnaire à l’aide d’une clé, et que la clé n’est pas trouvée dans le dictionnaire. Considérez le dictionnaire ci-dessous :
cities = {"Canada" : "Ottawa", "USA" : "Washington", "Italie" : "Rome"}
Les clés du dictionnaire sont “Canada”, “USA”, “Italie”. Vous pouvez accéder aux éléments du dictionnaire des villes à l’aide des trois clés. Toutefois, si vous essayez d’accéder à un élément à l’aide d’une clé qui n’existe pas, telle que “Brazil”, vous rencontrerez une KeyError, comme illustré ci-dessous :
Le message KeyError généré est le suivant :
File "/home/madici/Desktop/helloworld.py", line 6, in <module>
print(villes["Brésil"])
~~~~~~^^^^^^^^^^
KeyError : 'Brésil'
Pour résoudre une KeyError, assurez-vous que les clés que vous utilisez pour accéder aux éléments d’un dictionnaire sont effectivement présentes dans le dictionnaire. Pour ce faire, vous pouvez utiliser une instruction if…else comme suit :
cities = {"Canada" : "Ottawa", "USA" : "Washington", "Italie" : "Rome"}
pays = "Canada"
si pays dans villes :
print("La capitale de " pays " est " villes[pays])
else :
print("La clé " pays " n'est pas présente dans le dictionnaire cities")
De cette manière, vous éviterez de rencontrer des KeyErrors lorsque vous accéderez à des éléments d’un dictionnaire
Conclusion
Lorsque vous codez en Python, quel que soit votre niveau d’expertise, vous êtes certain de rencontrer des erreurs. Veillez donc à vous familiariser avec les différents types d’erreurs mis en évidence dans l’article afin de vous assurer que vous êtes en mesure de les gérer lorsqu’elles surviennent.
Vous pouvez également explorer quelques phrases Python utiles pour simplifier les tâches courantes.