Bases & algorithmique · 6 mondes · 18 étapes

Python avancé

Le langage lui-même : texte, compréhensions, objets, erreurs, modules.

Progression

0 %

0/18 étapes terminées

Avancé · 9 min de lecture

Erreurs et exceptions

Échouer proprement, et le dire clairement

1Définition

Une exception interrompt le cours normal du programme. try délimite le risque, except Type traite le cas prévu, finally s'exécute toujours, raise refuse une donnée invalide. Le principe : n'attraper que ce qu'on sait traiter.

2Principes fondamentaux

01

Nommer le type attrapé

except ValueError, jamais except: nu — qui avalerait aussi tes fautes de frappe et l'interruption au clavier.

02

Refuser tôt

Une fonction qui lève une exception sur une donnée absurde évite un résultat faux découvert trois écrans plus loin.

03

Le message est l'interface

« il manque 20 d'énergie » se corrige tout de suite ; « erreur » oblige à rouvrir le code.

04

Des types pour le métier

Une exception personnalisée (class EnergieInsuffisante(Exception)) permet à l'appelant de traiter précisément ce cas, et lui seul.

3Exemples pratiques

Traiter un lot sans jamais s'arrêter

Exemple
1valides, rejets = [], 02 3for s in saisies:4    try:5        valides.append(int(s))6    except ValueError:7        rejets += 18 9print(valides, rejets)

Le motif de tout traitement de données réelles : ce qui passe est gardé, ce qui échoue est compté, le traitement continue.

Exception métier

Exemple
1class EnergieInsuffisante(Exception):2    pass3 4def travailler(energie, cout):5    if energie < cout:6        raise EnergieInsuffisante(f"il manque {cout - energie}")7    return energie - cout

Le type permet un traitement ciblé, le message contient le chiffre exact qui manque.

4Erreurs courantes

Avaler l'erreur

À éviter

try:    traiter()except:    pass

À faire

try:    traiter()except ValueError as e:    print("Donnée invalide :", e)

Pourquoi : Un except nu qui ne fait rien transforme un bug en comportement silencieux et faux.

Utiliser assert pour valider une saisie

À éviter

assert age > 0

À faire

if age <= 0:    raise ValueError("âge doit être positif")

Pourquoi : Les assertions peuvent être désactivées à l'exécution : elles servent aux hypothèses internes, pas aux données extérieures.

Renvoyer None au lieu de lever

À éviter

def lire(cle):    return donnees.get(cle)

À faire

def lire(cle):    if cle not in donnees:        raise KeyError(cle)    return donnees[cle]

Pourquoi : Un None se propage et casse ailleurs, sans rapport visible avec la cause.

5Subtilités à connaître

  • ◆else après un try s'exécute seulement si aucune exception n'a eu lieu : il évite de mettre du code non risqué dans le try.
  • ◆raise ... from e conserve l'erreur d'origine dans la trace : précieux quand on convertit une erreur technique en erreur métier.
  • ◆Un finally contenant un return écrase la valeur renvoyée par le try : à éviter absolument.

6Vérifie ta compréhension

Question 1/3

Score 0

Quand finally s'exécute-t-il ?

Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.