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
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 dutry.
Capturer le message de l'exception
Utilisez as pour lier l'objet d'exception à un nom :
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
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneUn tuple de types capture toute exception de ces types (ou sous-classes).
La structure complète : try / except / else / finally
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 exceptionelse— utilisez-le pour le code qui dépend de la réussite dutry. 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é :
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bLes 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 bloctryse 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
Écrivez une expression qui tente int('abc') : si ValueError est levée, attribuez la chaîne 'errore' à `result` ; sinon, attribuez le nombre. Évaluez `result`.
Afficher l'indice
int('abc') lève ValueError.
Solution disponible après 3 tentatives
Exercice de révision
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.
Afficher l'indice
raise ValueError('...') dans la fonction ; capturez avec except ValueError as e.
Solution disponible après 3 tentatives
Défi supplémentaire
É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`.
Afficher l'indice
Utilisez try: result = int(text_val) suivi de except ValueError: result = None.
Solution disponible après 3 tentatives