Passer au contenu principal
eLearner.app
Module 2 · Leçon 4 sur 48/36 dans le cours~12 min
Leçons du module (4/4)

Gestion des erreurs : try/except

Lorsque quelque chose ne va pas à l'exécution (une division par zéro, une clé manquante, une opération sur des types incompatibles) Python lève une exception. Sans gestion, l'exception interrompt le programme. Avec try / except, vous pouvez la capturer et décider quoi faire.

La forme de base

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • le bloc try: contient le code qui peut échouer ;
  • le except <ErrorType>: est exécuté uniquement si ce type d'erreur est levé à l'intérieur du try.

Capturer le message de l'exception

Utilisez as pour lier l'objet d'exception à un nom :

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

Plusieurs types ensemble

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Un tuple de types capture toute exception de ces types (ou sous-classes).

La structure complète : try / except / else / finally

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else — utilisez-le pour le code qui dépend de la réussite du try. Gardez-le séparé pour ne pas capturer accidentellement des exceptions non liées.
  • finally — nettoyage qui doit toujours se produire (fermeture d'un fichier, libération d'une ressource). Exécuté à la fois en cas de succès et d'erreur.

Lever une exception : raise

Parfois, c'est vous qui voulez signaler que quelque chose s'est mal passé :

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Les exceptions intégrées les plus courantes que vous rencontrerez et lèverez :

  • ValueError — la valeur a le bon type mais est inacceptable (par exemple, parsing).
  • TypeError — le type est incorrect (par exemple, len(42)).
  • KeyError / IndexError — clé/index manquant.
  • ZeroDivisionError — division par zéro.
  • FileNotFoundError, PermissionError — opérations sur le système de fichiers.

Les clauses else et finally dans les blocs try

Un bloc try peut définir deux clauses supplémentaires :

  • else : exécuté uniquement si le bloc try se termine sans lever d'exception.
  • finally : exécuté toujours, qu'une exception se soit produite ou non. C'est idéal pour nettoyer des ressources (par exemple, fermer un fichier ouvert ou une connexion à une base de données).

À vous de jouer

Exercice#python.m2.l4.e1
Tentatives : 0Chargement…

Écrivez une expression qui tente int('abc') : si ValueError est levée, attribuez la chaîne 'errore' à `result` ; sinon, attribuez le nombre. Évaluez `result`.

Chargement de l'éditeur…
Afficher l'indice

int('abc') lève ValueError.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m2.l4.e2
Tentatives : 0Chargement…

Définissez `divide(a, b)` qui renvoie a/b mais lève ValueError avec le message 'divisore zero' si b vaut 0. Appelez ensuite divide(10, 0) dans un try/except et attribuez à `message` la chaîne de l'exception capturée.

Chargement de l'éditeur…
Afficher l'indice

raise ValueError('...') dans la fonction ; capturez avec except ValueError as e.

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m2.l4.e3
Tentatives : 0Chargement…

Écrivez un bloc `try-except` pour convertir la chaîne `text_val = "abc"` en un entier. Si la conversion lève une `ValueError`, attribuez `None` à `result`. Sinon, attribuez le nombre converti. Enfin, évaluez `result`.

Chargement de l'éditeur…
Afficher l'indice

Utilisez try: result = int(text_val) suivi de except ValueError: result = None.

Solution disponible après 3 tentatives