Module 3Appliquer la POO en Python
Chapitre 8 sur 10
Administrer les exceptions
Gérer, lever et créer ses propres exceptions sous forme de classes.
- ≈ 125 min
- 5 leçons
- 2 vidéos
- 2 exercices
Module 3Appliquer la POO en Python
Chapitre 8 sur 10
Gérer, lever et créer ses propres exceptions sous forme de classes.
Objectifs
Avec ce chapitre, tu sauras…
try, except, else, finally ;raise ;Le module M102 t'a appris à intercepter les erreurs avec try / except. Avec la POO, on comprend enfin ce qu'est une exception : un objet, instance d'une classe, organisée dans une hiérarchie d'héritage. On peut donc créer ses propres exceptions, adaptées à son application.
Leçon 1
BaseException
├── KeyboardInterrupt
└── Exception
├── ArithmeticError
│ └── ZeroDivisionError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── ValueError
├── TypeError
├── AttributeError
└── OSError
└── FileNotFoundErrorLeçon 2
def diviser(a, b):
try:
resultat = a / b
except ZeroDivisionError as e: # e est l'objet exception
print("Erreur :", e, "-", type(e).__name__)
return None
except TypeError:
print("Il faut des nombres.")
return None
else:
print("Division réussie.") # seulement s'il n'y a pas eu d'erreur
return resultat
finally:
print("Fin de diviser().") # toujours
diviser(10, 2)
diviser(10, 0)Vidéo · À regarder
FRPython - Cours complet pour débutants (2026)
SimpleTech par Sergio · YouTube
Leçon 3
Leçon 4
Leçon 5
| Écriture | Effet |
|---|---|
raise seul (dans un except) | relance l'exception en cours, après l'avoir enregistrée ou traitée en partie |
raise NouvelleErreur(...) from e | lève une nouvelle exception en gardant la cause d'origine (affichée dans le message d'erreur) |
Vidéo · À regarder
FRCours Python Complet pour Débutants - 10h de Formation de A à Z
Sébastien Daviot - Expertise Data · YouTube
1Une exception est…
2Les exceptions personnalisées héritent généralement de…
3except ArithmeticError: capture aussi…
4Pour lever une exception :
5raise seul dans un bloc except…
6Il faut placer en premier les except…
L'essentiel du chapitre
BaseException → Exception → …).try / except Classe as e (du plus spécifique au plus général) / else / finally.raise), l'appelant gère.class MonErreur(Exception): avec attributs et super().__init__(message) ; une classe de base commune.raise seul pour relancer ; raise Nouvelle(...) from e pour chaîner.Les exceptions en Python, en français.
class Compte:
def __init__(self, solde=0):
self.solde = solde
def retirer(self, montant):
if montant <= 0:
raise ValueError("Le montant doit être positif.")
if montant > self.solde:
raise ValueError(f"Solde insuffisant : {self.solde} DH disponibles.")
self.solde -= montantLa méthode qui détecte le problème lève l'exception (raise) ; elle ne sait pas comment réagir (afficher un message ? réessayer ?). C'est le code appelant (l'interface, le programme principal) qui gère l'exception avec try / except, car lui sait quoi faire.
On crée une exception personnalisée en héritant de Exception (ou d'une de ses filles).
class ErreurBancaire(Exception):
"""Classe de base de toutes les erreurs de l'application bancaire."""
class MontantInvalide(ErreurBancaire):
def __init__(self, montant):
super().__init__(f"Montant invalide : {montant}")
self.montant = montant
class SoldeInsuffisant(ErreurBancaire):
def __init__(self, solde, montant):
super().__init__(f"Solde insuffisant : {solde} DH, retrait demandé : {montant} DH")
self.solde = solde
self.montant = montantfrom banque.exceptions import ErreurBancaire, MontantInvalide, SoldeInsuffisant
class Compte:
def __init__(self, numero, solde=0):
self.numero = numero
self.solde = solde
def retirer(self, montant):
if montant <= 0:
raise MontantInvalide(montant)
if montant > self.solde:
raise SoldeInsuffisant(self.solde, montant)
self.solde -= montant
compte = Compte("MA001", 300)
try:
compte.retirer(500)
except SoldeInsuffisant as e:
print("Refusé :", e)
print("Il manque", e.montant - e.solde, "DH") # attributs de l'exception
except ErreurBancaire as e: # toutes les autres erreurs bancaires
print("Erreur bancaire :", e)except SoldeInsuffisant: est beaucoup plus lisible et précis que except ValueError: (qui capturerait aussi une erreur de conversion sans rapport). La classe de base ErreurBancaire permet de capturer toutes les erreurs métier en une fois, sans capturer les vrais bugs (TypeError, NameError).
import logging
def charger_compte(fichier):
try:
with open(fichier, encoding="utf-8") as f:
numero, solde = f.read().split(";")
return Compte(numero, float(solde))
except FileNotFoundError:
logging.error("Fichier %s introuvable", fichier)
raise # relance la même exception
except ValueError as e:
raise ErreurBancaire("Fichier de compte corrompu") from e # chaînageclass A(Exception):
pass
class B(A):
pass
for erreur in (A("a"), B("b"), ValueError("v")):
try:
raise erreur
except B:
print("B capturée")
except A:
print("A capturée")
except Exception:
print("Autre")
finally:
print("-")Crée une exception NoteInvalide (avec un attribut note) et modifie la méthode ajouter_note() de la classe Stagiaire (chapitre 4) pour qu'elle la lève. Écris un programme qui demande des notes à l'utilisateur et affiche un message clair pour une note hors de 0 à 20 et pour une saisie qui n'est pas un nombre.
La partie « Gestion des erreurs » du cours de Sébastien Daviot.