Exemples — Gestion des erreurs#
Validation d'entrée avec exceptions personnalisées#
class AgeInvalideError(ValueError):
"""Levée quand l'âge fourni est hors des bornes acceptées."""
def valider_age(age):
if not isinstance(age, int):
raise TypeError(f"age doit être un int, reçu {type(age).__name__}")
if not 0 <= age <= 150:
raise AgeInvalideError(f"age hors bornes : {age}")
return age
Boucle de saisie robuste#
def demander_entier(message):
while True:
try:
return int(input(message))
except ValueError:
print("veuillez saisir un nombre entier valide")
Retry avec nombre d'essais limité#
import time
def appeler_avec_retry(fonction, essais=3, delai=1):
if essais < 1:
raise ValueError("Le nombre d'essais doit être au moins de 1")
derniere_erreur = None
for tentative in range(1, essais + 1):
try:
return fonction()
except Exception as e:
derniere_erreur = e
print(f"Tentative {tentative}/{essais} échouée : {e}")
if tentative < essais:
time.sleep(delai)
raise derniere_erreur
## Nettoyage garanti avec `finally`
La clause `finally` s'exécute quoi qu'il arrive (succès, exception levée ou `return` anticipé). Elle sert à rétablir un état ou libérer une ressource non couverte par un `with`.
```python
import sys
def calcul_avec_redirection(chemin_log):
stdout_original = sys.stdout
fichier_log = open(chemin_log, "w", encoding="utf-8")
try:
sys.stdout = fichier_log
# Exécution de calculs dont les prints vont dans le fichier log...
print("Calcul en cours...")
finally:
# Toujours rétablir la sortie standard, même si une exception survient
fichier_log.close()
sys.stdout = stdout_original
(Note : pour de simples lectures/écritures de fichiers, préférez systématiquement la syntaxe with open(...)).
Exceptions multiples et hiérarchie personnalisée#
class ErreurApplication(Exception):
"""Base pour toutes les erreurs métier de l'application."""
class RessourceIntrouvableError(ErreurApplication):
pass
class PermissionRefuseeError(ErreurApplication):
pass
def gerer(action):
try:
action()
except RessourceIntrouvableError as e:
print(f"404 : {e}")
except PermissionRefuseeError as e:
print(f"403 : {e}")
except ErreurApplication as e:
print(f"erreur applicative : {e}")