Aller au contenu

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}")