10 types d’erreurs Python courants et comment les résoudre



En tant que programmeur, vous rencontrerez forcément des erreurs lors du développement de logiciels. Cela peut aller d’erreurs dans votre logique conduisant à des résultats inattendus, d’erreurs résultant de la violation des règles d’un langage de programmation, voire même 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 des erreurs de programmation lorsque vous utilisez Python.

Étant donné que des erreurs sont inévitables, une bonne façon de les gérer est de se renseigner sur les différents types d’erreurs qui peuvent survenir et comment elles se produisent. Cela vous permet d’éviter ou de minimiser ces erreurs lors de la programmation et aussi de savoir comment les gérer lorsqu’elles surviennent.

Voici quelques-unes des erreurs Python courantes que vous pourriez rencontrer lors de la programmation à l’aide du langage :

Erreurs de syntaxe

Une erreur de syntaxe est une erreur qui survient lorsque vous écrivez du code qui enfreint les règles du langage de programmation que vous utilisez. Cela se traduit par une ligne de code non valide.

En Python, par exemple, lors de l’impression d’une chaîne, elle doit être placée entre guillemets. Si vous ne le faites pas, une erreur de syntaxe se produit.

Une erreur de syntaxe peut également survenir lorsque vous manquez des parenthèses ouvrantes ou fermantes, des crochets ou des accolades, des mots clés ou des noms de fonction mal orthographiés, des deux-points manquants à la fin des instructions de contrôle de flux ou des opérateurs requis dans les expressions.

Généralement, des erreurs de syntaxe se produiront si vous enfreignez une règle sur la façon dont le code Python doit être écrit.

## syntax error arising from missing quotation mark
## around the string being printed
print("Hello World)

age = 20
## Syntax error arising from missing colon in an if statement
if age > 18
    print("Age is over 18")

## Syntax error because '(' was never closed
def square(x:
    return x * x
print(square(4))

Lors de l’exécution du code ci-dessus, vous rencontrerez un message d’erreur comme indiqué ci-dessous :

Le message d’erreur lors 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
if age > 18:
    print("Age is over 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, lors de l’écriture d’instructions de contrôle en Java, tout le code à exécuter une fois la condition évaluée est contenu dans des accolades.

En Python, cependant, le bloc de code sera indenté. Une indentation typique en Python se compose de quatre espaces ou d’une tabulation. Cependant, le nombre d’espaces n’a pas d’importance tant qu’il reste cohérent tout au long du code en cours d’écriture.

En tant que programmeur Python, vous êtes susceptible de rencontrer des erreurs d’indentation lorsque vous ne parvenez pas à ajouter l’indentation requise, comme 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 confond l’interpréteur, lorsque vous mettez des indentations au mauvais endroit ou lorsque vos indentations ne sont pas cohérentes dans votre base de code.

Un exemple de code qui entraîne une erreur d’indentation est illustré ci-dessous :

age = 20
if age > 18:
print("Age is greater than 18")
   print("You're allowed to drive")
else:
    print("Age is less than 18")

Les messages d’erreur résultant du code ci-dessus sont affichés ci-dessous :

Le message d’erreur lors de l’exécution du code est le suivant :

  File "/home/madici/Desktop/helloworld.py", line 3
    print("Age is greater than 18")
    ^
IndentationError: expected an indented block after 'if' statement on line 2

Pour corriger les erreurs, indentez la ligne après l’instruction if car une indentation est requise et assurez-vous qu’elle correspond à l’indentation dans le reste du code, comme indiqué ci-dessous :

age = 20
if age > 18:
   print("Age is greater than 18")
   print("You're allowed to drive")
else:
   print("Age is less than 18")

Erreur-type

En Python, une TypeError est une exception qui se produit lorsque vous essayez d’effectuer une opération en utilisant un type de données incompatible. Par exemple, si vous essayez d’ajouter une chaîne et un entier ou de concaténer un type de données chaîne avec un entier, vous rencontrerez une TypeError.

Vous pouvez également rencontrer des TypeErrors 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 dans un objet qui ne peut pas être itérable.

Généralement, toute opération utilisant un type de données incorrect conduira à une TypeError.

Des exemples d’opérations pouvant conduire à TypeErrors sont présentés ci-dessous :

# Type Error resulting from concatenating a string an an integer
age = 25
message = "I am " + age + " years old."


list1 = [1, "hello", 5, "world", 18, 2021]
#Type errors resulting from wrong usage of builtin in methods
print(sum(list1))

#TypeError resulting from adding a string and an integer
num1 = 10
num2 = "16"
print(num1 + num2)

#TypeError resulting from using a non integer index
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 du code est illustré ci-dessous :

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    message = "I am " + age + " years old."
              ~~~~~~~~^~~~~
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 = "I am " + str(age) + " years old."

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 il est appelé. Une AttributeError montre qu’un objet n’a pas d’attribut ou de méthode qui est appelé dessus.

Par exemple, si vous appelez une méthode de chaîne 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 n’a pas la méthode capitalize().

# AttributeError arising from calling capitalize() on an int value
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: 'int' object has no attribute '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 chaîne résout cette erreur comme indiqué ci-dessous :

Erreur d’importation

L’ImportError en Python se produit lorsque vous essayez d’importer un module qui est introuvable 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 correctement configuré son chemin 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 générée lorsque vous essayez d’importer un module introuvable.

Par exemple, le code ci-dessous 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: No module named '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 l’orthographe correcte pour le module et le bon chemin de fichier pour accéder au module.

Erreur de valeur

Il s’agit d’une exception qui se produit lorsqu’une fonction en Python reçoit une valeur du type de données correct mais que la valeur est une valeur inappropriée. Par exemple, la fonction Math.sqrt() utilisée pour trouver la racine carrée des valeurs numériques renverra une ValueError si vous passez un nombre négatif.

Autant la valeur sera du type correct, c’est-à-dire une valeur numérique, autant le fait d’être négatif en fait une valeur inappropriée pour le

La fonction int() qui convertit un nombre ou une chaîne renverra une ValueError si vous passez une chaîne qui n’est pas une valeur de chaîne numérique. Passer « 123 » ou « 45 » à la fonction ne renvoie aucune erreur car les chaînes peuvent être converties en la valeur entière appropriée.

Cependant, si vous transmettez une chaîne qui n’est pas une valeur de chaîne numérique telle que « Hello », elle renvoie une ValueError. En effet, « Hello », bien qu’il s’agisse d’une chaîne, est inapproprié car il n’a pas d’équivalent entier.

Un exemple de code qui génère une ValueError est illustré ci-dessous :

# Value error resulting from inappropriate int value in sqrt()
import math
num = -64
root = math.sqrt(num)
print(root)

# Value error resulting from passing a string with no integer
# equivalent into int() function
numString = "Hello"
num = int(numString)
print(num)

Les erreurs du code ci-dessus sont indiqué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: math domain error

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(root)

numString = "5231"
num = int(numString)
print(num)

IOError

L’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 de stockage sur disque insuffisant sur votre appareil, à une tentative d’accès à un fichier auquel vous ne disposez pas des autorisations suffisantes pour accéder ou lorsque vous essayez d’accéder à 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 IOError qui déclenche 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, tout ce que vous avez à faire est 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 IOErrors consiste à utiliser le bloc try except, comme indiqué ci-dessous :

NomErreur

Le NameError est une exception que vous rencontrerez lorsque vous essayez d’utiliser une variable, une fonction ou un module qui n’existe pas, n’est pas défini dans la portée actuelle ou n’a pas reçu de valeur.

Une telle erreur se produit généralement lorsque vous orthographiez mal des noms de variables ou de fonctions ou que vous les utilisez avant qu’ils ne soient définis. L’utilisation d’un module sans l’importer entraînera également une NameError.

Le code suivant entraînera une exception NameError :

# name error arises because the math module has not been imported
num = 64
root = math.sqrt(64)
print(root)

# NameError arises because x is used before it is defined
y = 23
print(x)

#NameEror because function name is not defined
def greet():
    print("Good morning")
great() #ameError: name 'great' is not defined

Les messages d’erreur suivants résultent du code ci-dessus :

Un exemple de message NameError est illustré ci-dessous :

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    root = math.sqrt(64)
           ^^^^
NameError: name 'math' is not defined

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 n’avez pas mal orthographié les noms de fonction ou de variable :

import math
num = 64
root = math.sqrt(64)
print(root)

y = 23
print(y)

def greet():
    print("Good morning")
greet()

Erreur d’index

Une IndexError est une exception qui se produit lorsque vous essayez d’accéder à un index dans une liste ou un tuple qui est hors limites. 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 ou les éléments de la liste. Dans ce cas, l’indice ou la liste ira de 0 à 4.

Si vous essayez d’accéder à un élément à un index supérieur à 4, vous rencontrerez une IndexError car l’index est hors plage dans la liste à partir de laquelle vous essayez d’accéder à un élément. Le code ci-dessous génère une IndexError :

list1 = [1, 2, 3, 4, 5]
item = list1[6] #IndexError because the list index is out of range
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[6] #IndexError because the list index is out of range
           ~~~~~^^^
IndexError: list index out of range

La meilleure façon d’éviter une IndexError est d’utiliser les fonctions range() et len() pour vous assurer que vous n’accédez qu’aux éléments qui sont dans la plage comme ceci :

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é est introuvable dans le dictionnaire. Considérez le dictionnaire ci-dessous:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

Les clés du dictionnaire sont « Canada », « États-Unis », « Italie ». Vous pouvez accéder aux éléments du dictionnaire des villes à l’aide des trois touches. Cependant, si vous essayez d’accéder à un élément à l’aide d’une clé qui n’existe pas, telle que « Brésil », vous rencontrerez une KeyError, comme indiqué ci-dessous :

Le message KeyError généré est illustré ci-dessous :

  File "/home/madici/Desktop/helloworld.py", line 6, in <module>
    print(cities["Brazil"])
          ~~~~~~^^^^^^^^^^
KeyError: 'Brazil'

Pour résoudre une KeyError, assurez-vous que les clés que vous utilisez pour accéder aux éléments d’un dictionnaire sont réellement présentes dans le dictionnaire. Pour ce faire, vous pouvez utiliser une instruction if…else comme ceci :

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

country = "Canada"

if country in cities:
    print("The capital city of " + country + " is " + cities[country])
else:
print("The key " + country + " is not present in the cities dictionary")

De cette façon, vous éviterez de rencontrer des KeyErrors lors de l’accès aux éléments d’un dictionnaire

Conclusion

Lorsque vous codez en Python, quel que soit votre niveau d’expertise, vous rencontrez forcément des erreurs. Par conséquent, assurez-vous de vous familiariser avec les différents types d’erreurs mis en évidence dans l’article pour vous assurer que vous êtes en mesure de les gérer lorsqu’elles surviennent.

Vous pouvez également explorer quelques one-liners Python utiles pour simplifier les tâches courantes.