Aller au contenu
Bonnes pratiques

try / except

try / except intercepte une erreur prévisible (valeur illisible, clé absente, division par zéro) pour la traiter au lieu d'arrêter le programme. Ne capturez que les erreurs que vous savez gérer.

  • erreur
  • exception
  • ValueError
  • raise
  • finally
  • else

Syntaxe

Modèle
try:    ...except (ValueError, KeyError) as e:    ...else:    ...    # seulement si aucune exceptionfinally:    ...    # dans tous les casraise NouvelleErreur("message") from e

Exemple

Exemple concret
import csvimport iosource = io.StringIO("""eleve;noteAna;14Bob;absChloé;17""")notes, rejets = [], []for ligne in csv.DictReader(source, delimiter=";"):    try:        note = int(ligne["note"])    except ValueError:        rejets.append(ligne["eleve"])    else:        notes.append(note)print(notes, rejets)          # → [14, 17] ['Bob']def lire_note(texte):    try:        return int(texte)    except ValueError as e:        raise ValueError(f"Note illisible : {texte!r}") from etry:    lire_note("12,5")except ValueError as e:    print(e, "| cause :", type(e.__cause__).__name__)  # → Note illisible : '12,5' | cause : ValueError

À retenir

  1. Le bloc else ne s'exécute que si aucune exception n'a été levée : gardez dans try la seule ligne qui peut échouer, et la suite du traitement dans else.
  2. finally s'exécute dans tous les cas, erreur ou non : on y libère une ressource (connexion, verrou) quand with n'est pas disponible.
  3. Piège : except nu (except:) ou except Exception qui avale tout. Ils masquent vos fautes de frappe (NameError) et les erreurs inattendues ; capturez le type précis et, si vous devez vraiment tout attraper, journalisez l'erreur avant de continuer.
  4. raise NouvelleErreur(...) from e conserve l'erreur d'origine dans la trace : on ajoute un contexte métier sans perdre la cause.
  5. Quand le test est simple, validez plutôt que de capturer : if cle in d est plus clair qu'un try sur d[cle], sauf si l'absence est rare.

Voir aussi