Retour au cours

erreurs et exceptions : try/except/else/finally

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 finally ne s’exécute pas si return (il s’exécute quand même)

exercices

  1. conversion robuste d’une liste de chaînes vers int (ignorer les invalides).
  2. wrapper read_text(path) qui gère absence de fichier et renvoie None.
  3. fetch(url) avec requests qui gère HTTPError et Timeout proprement.