Gestion des exceptions

Bloc try/except

On peut gérer (ou attraper) une exception en utilisant un bloc try/except et le nom d’une classe d’exception:

 try:
     a = 1 / 0
 except ZeroDivisionError:
     print("Quelqu'un a essayé de diviser par zéro!")

# Affiche: Quelqu'un a essayé de diviser par zéro!

À noter : le bloc dans try s’interrompt dès que l’exception est levée, et on ne passe dans le bloc except que si une exception a effectivement été levée.

 x = 14
 y = 0
 try:
     z = x / y
     print("z vaut", z)
 except ZeroDivisionError:
     print("Ouelqu'un a essayé de diviser par zéro!")

# Affiche: Ouelqu'un a essayé de diviser par zéro!

Notez que la ligne print("z vaut", z) n’as pas été exécutée.

Autr exemple:

 x = 14
 y = 2
 try:
     z = x / y
     print("z vaut", z)
 except ZeroDivisionError:
     print("Ouelqu'un a essayé de diviser par zéro!")

# Affiche: 'z vaut 7.0'

Notez que la ligne print("Ouelqu'un a essayé de diviser par zéro!") n’as pas été exécutée.

Gestion de plusieurs exceptions

Le mot après except doit être celui d’une classe, et l’exception n’est gérée que si sa classe est égale ou une fille de celle ci.

Par exemple, ceci fonctionne car ZeroDivisionError est bien une fille de la classe ArithmeticError:

x = 14
y = 0
try:
    z = x / y
    print("z vaut", z)
except ArithmeticError:
    print("Ouelqu'un a essayé une opération impossible")

On peut aussi mettre plusieurs blocs de except:

try:
    tente_un_truc_risqué()
except ZeroDivisionError:
    print("raté : division par zéro!")
except FileNotFoundError:
    print("raté : fichier non trouvé")

Ou gérer des exception de classes différentes avec le même bloc:

try:
    tente_un_truc_risqué()
except (ZeroDivisionError, FileNotFoundError)
    print("raté!")

Accéder à la valeur de l’exception

On peut récupérer l’instance de l’exception levée avec le mot-clé as:

try:
    ouvrir_fichier()
except FileNotFoundError as e:
    print("le fichier: ", e.filename, "n'existe pa")

Ici on utilise l’attribut filename de la classe FileNotFoundError pour afficher un message d’erreur