Comment gerer les exceptions en Python : un guide complet sur try, except et finally

Apprenez a gerer les erreurs en Python avec la bonne approche. Decouvrez comment utiliser les exceptions, les blocs try-except-finally, et les bonnes pratiques pour ecrire du code robuste.

Mahmoud DEVO
Mahmoud DEVO
December 27, 2025 7 min read
Comment gerer les exceptions en Python : un guide complet sur try, except et finally

Gestion des exceptions en Python : une approche structuree

Introduction

La gestion des exceptions est l’une des competences fondamentales que tout developpeur Python doit maitriser. Dans le monde reel, les programmes interagissent avec des fichiers, des bases de donnees, des APIs externes et des entrees utilisateur - autant de sources potentielles d’erreurs. Sans une gestion appropriee des exceptions, votre application peut s’arreter brutalement, perdre des donnees ou laisser des ressources non liberees.

Pourquoi la gestion des exceptions est-elle si importante ?

  • Robustesse : Un code bien gere continue de fonctionner meme face a des situations imprevues
  • Experience utilisateur : Les messages d’erreur clairs aident les utilisateurs a comprendre et resoudre les problemes
  • Debogage : Les traces d’erreur bien structurees facilitent l’identification des bugs
  • Maintenance : Un code avec une gestion d’erreurs coherente est plus facile a maintenir

Dans cet article, nous allons explorer en profondeur la gestion des exceptions en Python, depuis les concepts de base jusqu’aux techniques avancees utilisees par les developpeurs professionnels.

La syntaxe de base

Avant de plonger dans les details, il est important de comprendre la syntaxe de base pour gerer les exceptions. Voici un exemple simple :

def failing_function():
    raise ValueError('Exemple d erreur !')

try:
    failing_function()
except ValueError as e:
    print('Erreur :', e)

Dans cet exemple, nous avons une fonction failing_function qui lance une exception ValueError. Lorsque cette exception est lancee, le code dans l’exception handling (except) est execute. Ici, on imprime simplement la valeur de l’erreur.

Gestion des exceptions : les blocs try et except

Un bloc try-except est compose d’un bloc de code qui peut eventuellement lever une exception (le bloc try) et d’une ou plusieurs clauses except pour gerer ces exceptions. Voici un exemple plus complet :

def failing_function():
    raise ValueError('Exemple d erreur !')

try:
    failing_function()
    print('Ceci ne sera jamais affiche')
except ValueError as e:
    print('Erreur :', e)
    # Code pour gerer l exception...

Gerer plusieurs types d’exceptions

Vous pouvez gerer differents types d’exceptions avec plusieurs clauses except :

def process_data(data):
    try:
        value = int(data)
        result = 100 / value
        return result
    except ValueError:
        print("Erreur : la donnee n'est pas un nombre valide")
        return None
    except ZeroDivisionError:
        print("Erreur : division par zero impossible")
        return None
    except Exception as e:
        print(f"Erreur inattendue : {e}")
        return None

Gerer plusieurs exceptions dans un seul bloc

Si vous souhaitez traiter plusieurs types d’exceptions de la meme maniere :

try:
    result = risky_operation()
except (ValueError, TypeError, KeyError) as e:
    print(f"Une erreur s'est produite : {e}")
    log_error(e)

Le bloc else

Le bloc else est execute uniquement si aucune exception n’a ete levee dans le bloc try :

def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Impossible de diviser par zero")
        return None
    else:
        print(f"Division reussie : {result}")
        return result
    finally:
        print("Operation terminee")

# Exemples d'utilisation
divide(10, 2)   # Affiche : Division reussie : 5.0 puis Operation terminee
divide(10, 0)   # Affiche : Impossible de diviser par zero puis Operation terminee

Lever une nouvelle exception

Vous pouvez egalement lever une nouvelle exception en utilisant la syntaxe suivante :

try:
    failing_function()
except ValueError as e:
    raise TypeError('Erreur de type') from e

Cette technique est utile pour transformer une exception de bas niveau en une exception plus significative pour votre domaine metier.

Gestion des exceptions avancee

Nous allons maintenant explorer quelques concepts plus avances pour gerer les exceptions en Python.

Le bloc finally

Le bloc finally est un bloc qui sera toujours execute, qu’une exception soit levee ou non. Il est ideal pour liberer des ressources systeme :

def read_file_safely(filename):
    file = None
    try:
        file = open(filename, 'r')
        content = file.read()
        return content
    except FileNotFoundError:
        print(f"Le fichier {filename} n'existe pas")
        return None
    except PermissionError:
        print(f"Pas de permission pour lire {filename}")
        return None
    finally:
        if file:
            file.close()
            print("Fichier ferme correctement")

Les exceptions chainees

Les exceptions chainees permettent de conserver le contexte de l’erreur originale :

try:
    5 / 0
except ZeroDivisionError as e:
    raise ValueError("Division echouee") from e

La trace d’erreur affichera les deux exceptions, ce qui facilite le debogage.

Creer des exceptions personnalisees

Pour des applications complexes, creez vos propres classes d’exceptions :

class ValidationError(Exception):
    """Exception levee lors d'une erreur de validation"""
    def __init__(self, field, message):
        self.field = field
        self.message = message
        super().__init__(f"{field}: {message}")

class UserService:
    def create_user(self, email, password):
        if not email or '@' not in email:
            raise ValidationError('email', 'Format email invalide')
        if len(password) < 8:
            raise ValidationError('password', 'Le mot de passe doit contenir au moins 8 caracteres')
        # Creer l'utilisateur...

# Utilisation
try:
    service = UserService()
    service.create_user('test', '123')
except ValidationError as e:
    print(f"Erreur de validation sur {e.field}: {e.message}")

Bonnes Pratiques

Voici les recommandations essentielles pour une gestion efficace des exceptions :

1. Capturez des exceptions specifiques

Evitez de capturer Exception ou pire, BaseException sans raison valable. Capturez uniquement les exceptions que vous savez gerer.

# Mauvais
try:
    result = process_data(data)
except Exception:
    pass  # Cache toutes les erreurs

# Bon
try:
    result = process_data(data)
except ValueError as e:
    logger.warning(f"Donnee invalide: {e}")
    result = default_value

2. Utilisez le gestionnaire de contexte (with)

Pour les ressources qui doivent etre liberees, preferez with au bloc try-finally :

# Au lieu de
try:
    f = open('fichier.txt')
    content = f.read()
finally:
    f.close()

# Preferez
with open('fichier.txt') as f:
    content = f.read()

3. Loggez les exceptions avec contexte

Ne vous contentez pas de capturer les exceptions, loggez-les avec suffisamment de contexte :

import logging

logger = logging.getLogger(__name__)

try:
    user = get_user(user_id)
except DatabaseError as e:
    logger.error(f"Impossible de charger l'utilisateur {user_id}", exc_info=True)
    raise

4. Re-levez les exceptions quand necessaire

Si vous ne pouvez pas gerer completement une exception, re-levez-la apres avoir fait le menage :

try:
    connection = create_connection()
    process_data(connection)
except ConnectionError:
    cleanup_partial_state()
    raise  # Laisse l'appelant gerer

5. Documentez les exceptions levees

Utilisez les docstrings pour documenter les exceptions que votre fonction peut lever :

def parse_config(path: str) -> dict:
    """
    Parse un fichier de configuration.

    Args:
        path: Chemin vers le fichier de configuration

    Returns:
        Dictionnaire contenant la configuration

    Raises:
        FileNotFoundError: Si le fichier n'existe pas
        ValueError: Si le format du fichier est invalide
    """
    # Implementation...

Pieges Courants

Evitez ces erreurs frequentes lors de la gestion des exceptions :

1. Le except nu (bare except)

# DANGEREUX - capture meme KeyboardInterrupt et SystemExit
try:
    do_something()
except:
    pass

# Correct
try:
    do_something()
except Exception as e:
    logger.error(f"Erreur: {e}")

2. Ignorer silencieusement les exceptions

# Mauvais - les erreurs sont perdues
try:
    important_operation()
except Exception:
    pass

# Bon - au minimum, loggez l'erreur
try:
    important_operation()
except Exception as e:
    logger.exception("Operation echouee")

3. Capturer trop large trop tot

# Mauvais - empeche de distinguer les types d'erreurs
def process_all(items):
    try:
        for item in items:
            process_item(item)
    except Exception:
        print("Erreur quelque part")

# Bon - gestion granulaire
def process_all(items):
    errors = []
    for item in items:
        try:
            process_item(item)
        except ValidationError as e:
            errors.append((item, e))
    if errors:
        raise BatchProcessingError(errors)

4. Oublier de nettoyer les ressources

# Risque de fuite de ressources
def unsafe_read():
    f = open('file.txt')
    if some_condition:
        raise ValueError("Condition non remplie")
    return f.read()
    # Le fichier n'est jamais ferme si l'exception est levee

# Correct
def safe_read():
    with open('file.txt') as f:
        if some_condition:
            raise ValueError("Condition non remplie")
        return f.read()

Conclusion

La gestion des exceptions en Python est bien plus qu’un simple mecanisme de controle d’erreurs - c’est une philosophie de programmation defensive qui rend votre code plus robuste, plus maintenable et plus professionnel.

Points cles a retenir :

  • Utilisez try-except pour capturer les exceptions de maniere specifique
  • Le bloc finally garantit l’execution du code de nettoyage
  • Le bloc else s’execute uniquement si aucune exception n’est levee
  • Creez des exceptions personnalisees pour votre domaine metier
  • Preferez les gestionnaires de contexte (with) pour les ressources
  • Loggez toujours les exceptions avec suffisamment de contexte
  • Ne capturez jamais d’exceptions que vous ne savez pas gerer

En maitrisant ces concepts et en appliquant les bonnes pratiques presentees, vous serez en mesure d’ecrire du code Python qui gere elegamment les situations d’erreur tout en restant lisible et maintenable.

Pour aller plus loin

  • Explorez le module contextlib pour creer vos propres gestionnaires de contexte
  • Etudiez le module traceback pour des traces d’erreur personnalisees
  • Decouvrez warnings pour les avertissements non-fatals
  • Consultez la documentation officielle Python sur les exceptions
Advertisement

In-Article Ad

Dev Mode

Share this article

Mahmoud DEVO

Mahmoud DEVO

Senior Full-Stack Developer

I'm a passionate full-stack developer with 10+ years of experience building scalable web applications. I write about Vue.js, Node.js, PostgreSQL, and modern DevOps practices.

Enjoyed this article?

Subscribe to get more tech content delivered to your inbox.

Related Articles