3.1. Les erreurs

Les erreurs sont des avertissements de l’interprète Python indiquant un problème qui empêche le programme de se dérouler correctement. Intuitivement, une erreur survient lorsque le programme demande à l’ordinateur de faire quelque chose d’interdit, comme une division par zéro ou une écriture dans un fichier ouvert seulement en lecture, ou lorsque que l’interprète ne parvient pas à comprendre ce qu’on lui demande de faire, comme la concaténation d’une chaîne de caractères avec un nombre entier. Si l’erreur n’est pas alors traitée, le programme se termine.

Il existe deux principaux types d’erreurs en Python :

  1. Les erreurs de syntaxe

  2. Les exceptions (ou erreurs logiques)

3.1.1. Les erreurs de syntaxe

Les erreurs de syntaxe sont très simples à identifier et à corriger, car elles surviennent avant même le début de l’exécution du programme. Elles sont détectées par l’interprète lorsqu’il corrige la syntaxe de notre code avant de l’exécuter, afin de s’assurer que toutes les instructions sont correctement formulées.

Par exemple, en français, nous pouvons dire que la phrase « deux et deux faire cinq » est syntaxiquement incorrecte avant même de vérifier si ce qu’elle affirme a un sens, car le verbe est à l’infinitif.

En Python, ce genre d’erreurs peut par exemple survenir à cause d’une parenthèse qui n’a pas été fermée, ou d’une instruction if ne se terminant pas par le symbole :.

a = 3
print(a +)  # l'opérateur + ne reçoit pas de deuxième opérande
File "<input>", line...
  print( a +)
            ^
SyntaxError: invalid syntax

L’interprète affiche l’erreur SyntaxError dans la console en indiquant l’endroit précis où elle se trouve dans le code. Les erreurs de syntaxes ne passent donc jamais inaperçues.

3.1.2. Les exceptions

Les exceptions surviennent en cours d’exécution du programme, contrairement aux erreurs de syntaxes. Elles apparaissent la plupart du temps lorsque le programme est exposé à une situation extraordinaire que le développeur n’a pas anticipée. Lorsque l’erreur est rencontrée à l’exécution, Python la signale en déclenchant une exception qui indique le type de l’erreur rencontrée, généralement accompagnée d’un message descriptif. Lorsqu’une exception survient et n’est pas explicitement traitée, comme nous le verrons dans le chapitre suivant, le programme se termine avec l’affichage d’un message d’erreur correspondant.

Prenons pour exemple le programme suivant.

while True:
    n = float(input("Veuillez entrer un nombre : "))
    print(f"L'inverse du nombre est : {1/n}")
Veuillez entrer un nombre : 4
L'inverse du nombre est : 0.25
Veuillez entrer un nombre : 0.1
L'inverse du nombre est : 10.0
Veuillez entrer un nombre : 50
L'inverse du nombre est : 0.02
...

Aucune erreur n’est signalée et il est alors facile de croire que le programme fonctionne sans problème. Mais que se passe-t-il si nous désobéissons et que la saisie n’est pas un nombre ?

Veuillez entrer un nombre : huit
Traceback (most recent call last):
  File "<input>", line...
    n = float(input("Veuillez entrer un nombre : "))
ValueError: could not convert string to float: 'huit'

Nous obtenons une erreur de type ValueError qui nous indique que la chaîne de caractères "huit" ne peut pas être convertie en nombre décimal. Mais le programme comporte une faille plus subtile, car il n’y a même pas besoin de désobéir aux indications du programme pour déclencher un exception.

Veuillez entrer un nombre : 0
Traceback (most recent call last):
  File "<input>", line...
    print(f"L'inverse du nombre est : {1/n}")
ZeroDivisionError: float division by zero

En effet, lorsque le nombre est zéro, il est impossible d’effectuer la division. L’interprète nous le signale avec une erreur de type ZeroDivisionError. De telles erreurs sont difficiles à identifier car elles ne se produisent que dans des conditions très précises.