3.3. Lever des exceptions

Il est parfois utile de lever (ou déclencher) manuellement une exception. Pour ce faire, on utilise l’instruction raise suivie d’un objet héritant de la classe Exception, comme toutes les exceptions natives de Python ou les classes personnalisées qui en héritent. Il est possible de préciser la raison de l’erreur en paramètre du constructeur.

while True:
    n = float(input("Veuillez entrer un nombre positif : "))
    if n < 0:
        raise ValueError("Le nombre n'est pas positif")
Veuillez entrer un nombre positif : 3
Veuillez entrer un nombre positif : -2
Traceback (most recent call last):
  File "<input>", line...
    raise ValueError("Le nombre n'est pas positif")
ValueError: Le nombre n'est pas positif

3.3.1. L’instruction else

Si l’on souhaite que certaines instructions ne soient exécutées que dans le cas où le bloc d’instructions try n’a rencontré aucune erreur, on peut les placer dans un bloc else après les blocs except.

while True:
    try:
        n = float(input("Veuillez entrer un nombre : "))
        print(f"L'inverse du nombre est: {1/n}")
    except Exception as e:
        print(f"Une erreur de type {type(e)} est survenue")
    else:
        print("Aucune erreur n'est survenue, on recommence...")
Veuillez entrer un nombre : 4
L'inverse du nombre est : 0.25
Aucune erreur n'est survenue, on recommence...
Veuillez entrer un nombre : 0
Une erreur de type <class 'ZeroDivisionError'> est survenue
...

3.3.2. L’instruction finally

Finalement, si l’on souhaite que des instructions soient exécutées en toute situation, avec ou sans déclenchement d’exception, on peut utiliser un bloc finally. Cela est particulièrement utile pour libérer des ressources, car il s’agit d’opérations à exécuter même en cas d’exception. Utilisé de cette manière, le bloc finally a le même effet que l’instruction with couramment employée pour l’ouverture des fichiers.

try:
    file = open("file.txt", 'r', encoding="utf-8")
    # opérations sur le fichier
finally:          # peu importe ce qui peut se produire...
    file.close()  # on referme le fichier