les exceptions signalent des erreurs. bien les capturer rend votre code robuste.
objectifs
- utiliser
try/except/else/finally - connaître les exceptions courantes
- lever vos propres erreurs avec
raise - faire des IO sûrs qui se ferment toujours
explication détaillée
structure type :
try:
...
except ValueError as e:
...
except (TypeError, KeyError):
...
else:
# exécuté si aucun except n'a attrapé
...
finally:
# toujours exécuté
...
exceptions courantes : ValueError, TypeError, KeyError, FileNotFoundError, ZeroDivisionError, TimeoutError.
exemples exécutables
try:
x = int("3.0")
except ValueError:
x = int(float("3.0"))
print(x)
def safe_div(a, b):
if b == 0:
raise ZeroDivisionError("division par zéro interdite")
return a / b
try:
safe_div(1, 0)
except ZeroDivisionError as e:
print("erreur:", e)
# try/else/finally
f = None
try:
f = open("note.txt", encoding="utf-8")
except FileNotFoundError:
print("fichier absent")
else:
print("taille:", len(f.read()))
finally:
if f:
f.close()
bonnes pratiques
- capturer spécifiquement (éviter
except Exception:sans raison) - logguer le message d’erreur
- ne pas avaler silencieusement une exception
- préférer des guard clauses qui évitent l’exception
pièges courants
except:nu → masque tout (keyboardinterrupt compris)- rattraper et oublier d’agir (ni corriger ni réélever)
- supposer que
finallyne s’exécute pas sireturn(il s’exécute quand même)
exercices
- conversion robuste d’une liste de chaînes vers
int(ignorer les invalides). - wrapper
read_text(path)qui gère absence de fichier et renvoieNone. fetch(url)avecrequestsqui gèreHTTPErroretTimeoutproprement.