02/03/2025
Les Exceptions en Python
Pr. MERZOUK Soukaina 437
437
Les Exceptions en Python
Les erreurs font partie du quotidien du développeur
Il existe deux grandes catégories d'erreurs en programmation :
Les erreurs dues aux données incorrectes
Par exemple, si le programme attend un nombre entier et que
l'utilisateur entre du texte, cela peut provoquer une erreur.
Ce type d'erreur est souvent causé par un mauvais format des
données d'entrée.
Pr. MERZOUK Soukaina 438
438
02/03/2025
Les Exceptions en Python
Les erreurs font partie du quotidien du développeur
Il existe deux grandes catégories d'erreurs en programmation :
Les erreurs dues aux bugs dans le code
Ces erreurs sont introduites par le développeur lui-même, soit par
inadvertance, soit par manque de compréhension de la logique.
Elles peuvent provoquer des comportements inattendus, voire
l'arrêt complet du programme.
La meilleure manière de gérer ces erreurs est d'apprendre à
anticiper et traiter les exceptions de manière élégante.
Pr. MERZOUK Soukaina 439
439
Pourquoi gérer les erreurs ?
Importance de la gestion des erreurs
Éviter les crashs imprévus.
Améliorer l’expérience utilisateur.
Faciliter le débogage et la maintenance.
Rendre le code plus robuste et professionnel.
Pr. MERZOUK Soukaina 440
440
02/03/2025
Quand les données ne sont pas ce
qu'elles devraient être
Exemple
value = int(input("Entrez un nombre naturel : "))
print("Son inverse est :", 1 / value)
Problèmes possibles :
Si l'utilisateur entre un texte au lieu d'un nombre, le programme
plantera avec une ValueError.
Si l'utilisateur entre 0, cela provoquera une ZeroDivisionError.
Si l'utilisateur ne tape rien et appuie sur Entrée, il y aura aussi une
erreur.
Pr. MERZOUK Soukaina 441
441
Quand les données ne sont pas ce
qu'elles devraient être
Exemple d'erreur affichée dans le terminal :
Traceback (most recent call last):
File "[Link]", line 1, in <module>
value = int(input('Enter a natural number: '))
ValueError: invalid literal for int() with base 10: ''
Pour éviter ces problèmes, on pourrait vérifier manuellement que
l'entrée est bien un entier valide.
Cependant, Python recommande une autre approche : les exceptions.
Philosophie en Python : "Mieux vaut gérer l’erreur que l’éviter"
Pr. MERZOUK Soukaina 442
442
02/03/2025
Le bloc try-except
Qu’est-ce qu’une exception ?
Une exception est une erreur interceptable pendant l’exécution
du programme.
Python permet de gérer ces erreurs avec le bloc try-except.
Principe :
try : contient le code "risqué" susceptible de provoquer une
erreur.
except : capture l'exception si une erreur se produit et permet de
réagir.
Pr. MERZOUK Soukaina 443
443
Le bloc try-except
Tableau des exceptions courantes en Python
Exception Cause
ZeroDivisionError Division par zéro
ValueError Conversion invalide (ex : int("abc"))
TypeError Opération avec des types incompatibles ("text" + 5)
Index hors limite d'une liste (list[10] si la liste a 5
IndexError
éléments)
Clé inexistante dans un dictionnaire
KeyError
(dict["clé_absente"])
Fichier introuvable (open("[Link]") si le fichier
FileNotFoundError
n'existe pas)
Pr. MERZOUK Soukaina 444
444
02/03/2025
Le bloc try-except
Exemple avec try-except :
try:
value = int(input("Entrez un nombre naturel : "))
print("Son inverse est :", 1 / value)
except ValueError:
print("Erreur : Vous devez entrer un nombre
entier.")
except ZeroDivisionError:
print("Erreur : Impossible de diviser par zéro.")
Pr. MERZOUK Soukaina 445
445
Le bloc try-except
Exemple avec try-except :
Comment ça fonctionne ?
Python exécute les instructions dans le bloc try.
Si une erreur survient, Python interrompt immédiatement le bloc
try et cherche un bloc except correspondant.
Si l'exception correspond, le code du except est exécuté.
Le programme ne s'arrête pas brutalement et peut continuer
après l'exception.
Pr. MERZOUK Soukaina 446
446
02/03/2025
Le bloc try-except
Exemples de scénarios :
Entrée : "abc"
Sortie : "Erreur : Vous devez entrer un nombre entier."
Entrée : "0"
Sortie : "Erreur : Impossible de diviser par zéro."
Entrée : "4"
Sortie : "Son inverse est : 0.25"
Pr. MERZOUK Soukaina 447
447
Une exception prouve la règle
Il est important de noter que seules les erreurs qui se produisent dans
le bloc try sont capturées.
Exemple :
try:
value = int(input("Entrez un nombre : "))
print("Son inverse est :", 1 / value)
except ValueError:
print("Erreur : Entrée invalide.")
print("Fin du programme.")
Pr. MERZOUK Soukaina 448
448
02/03/2025
Une exception prouve la règle
Cas d’exécution :
Entrée : "xyz"
Sortie : "Erreur : Entrée invalide."
"Fin du programme."
Entrée : "2"
Sortie : "Son inverse est : 0.5"
"Fin du programme."
Remarque : Même après une erreur, le programme continue son
exécution après le except.
Pr. MERZOUK Soukaina 449
449
Gérer plusieurs exceptions
Si plusieurs types d’erreurs peuvent survenir, on peut gérer chaque cas
séparément.
Méthode 1 : Plusieurs blocs except
try:
value = int(input("Entrez un nombre naturel : "))
print("Son inverse est :", 1 / value)
except ValueError:
print("Erreur : Vous devez entrer un nombre entier.")
except ZeroDivisionError:
print("Erreur : Impossible de diviser par zéro.")
except Exception as e: # Capture toute autre erreur inattendue
print(f"Une erreur inattendue est survenue : {e}")
Pr. MERZOUK Soukaina 450
450
02/03/2025
Gérer plusieurs exceptions
Méthode 2 : Capturer plusieurs exceptions dans un même bloc
try:
value = int(input("Entrez un nombre naturel : "))
print("Son inverse est :", 1 / value)
except (ValueError, ZeroDivisionError) as e:
print("Erreur :", e)
Différence :
La première méthode traite chaque erreur individuellement.
La seconde regroupe plusieurs erreurs sous un même message.
Pr. MERZOUK Soukaina 451
451
Le bloc finally : Exécuter du code quoi
qu’il arrive
Le bloc finally permet d'exécuter un code même si une erreur se produit.
try:
value = int(input("Entrez un nombre : "))
print("Son inverse est :", 1 / value)
except ValueError:
print("Erreur : Entrée invalide.")
except ZeroDivisionError:
print("Erreur : Impossible de diviser par zéro.")
finally:
print("Ce message s'affiche toujours, erreur ou
pas.")
Pr. MERZOUK Soukaina 452
452
02/03/2025
Le bloc finally : Exécuter du code quoi
qu’il arrive
Scénarios d'exécution :
Entrée : "abc"
Sortie : "Erreur : Entrée invalide."
"Ce message s'affiche toujours, erreur ou pas."
Entrée : "0"
Sortie : "Erreur : Impossible de diviser par zéro."
"Ce message s'affiche toujours, erreur ou pas."
Entrée : "4"
Sortie : "Son inverse est : 0.25"
Pr. MERZOUK Soukaina "Ce message s'affiche toujours, erreur ou pas." 453
453
Le bloc finally : Exécuter du code quoi
qu’il arrive
Le finally est utile pour :
Fermer un fichier après son utilisation.
Libérer des ressources (connexions réseau, base de données).
Effectuer des actions de nettoyage.
Pr. MERZOUK Soukaina 454
454
02/03/2025
Le bloc finally : Exécuter du code quoi
qu’il arrive
Résumé
Les erreurs font partie du quotidien du développeur.
Les exceptions permettent d'éviter les arrêts brutaux du
programme.
Le bloc try contient du code risqué.
Les blocs except gèrent les erreurs spécifiques.
Le bloc finally exécute du code dans tous les cas.
Grâce aux exceptions, un programme peut être plus robuste,
fiable et compréhensible pour l'utilisateur final.
Pr. MERZOUK Soukaina 455
455
Gérer plusieurs exceptions
Complète le code suivant pour gérer les erreurs si l'utilisateur entre une
mauvaise valeur ou tente une division par zéro.
def diviser():
a = input("Entrez un premier nombre : ")
b = input("Entrez un deuxième nombre : ")
try:
# Convertir les entrées en nombres et faire la division
a = int(a)
b = int(b)
print(f"Résultat : {a / b}")
Pr. MERZOUK Soukaina 456
456
02/03/2025
Gérer plusieurs exceptions
Complète le code suivant pour gérer les erreurs si l'utilisateur entre une
mauvaise valeur ou tente une division par zéro.
def diviser():
…
except ____________: #pour capturer une erreur de
conversion
print("Erreur : Veuillez entrer des nombres valides.")
except ____________: # À compléter pour capturer la
division par zéro
print("Erreur : Impossible de diviser par zéro.")
diviser()
Pr. MERZOUK Soukaina 457
457
Gérer plusieurs exceptions
Solution
def diviser():
…
try:
a = int(a)
b = int(b)
print(f"Résultat : {a / b}")
except ValueError:
print("Erreur : Veuillez entrer des nombres valides.")
except ZeroDivisionError:
print("Erreur : Impossible de diviser par zéro.")
diviser()
Pr. MERZOUK Soukaina 458
458
02/03/2025
Modules
Pr. MERZOUK Soukaina 459
459
Travailler avec les Modules en Python
Les modules permettent de diviser un programme en plusieurs fichiers
pour en faciliter la maintenance et améliorer ses performances.
Un module est un fichier contenant du code Python, incluant des
fonctions, des classes et des variables.
Un fichier Python, par exemple [Link], est un module dont le nom est
test.
Pr. MERZOUK Soukaina 460
460
02/03/2025
Importer un Module en Python
L'importation d'un module dans un programme s'effectue à l'aide du
mot-clé import, suivi du nom du module.
Exemple d'importation du module standard math et utilisation de la
fonction sqrt() :
import math
num = 4
print([Link](num))
Un module n'est importé qu'une seule fois par session d'interpréteur.
En cas de modification, il est nécessaire de redémarrer l'interpréteur ou
d'utiliser la fonction reload().
Pr. MERZOUK Soukaina 461
461
Créer un Module en Python
Un module est créé en enregistrant un fichier Python contenant des
fonctions. Exemple d'un fichier [Link] :
def addition(x, y):
return x + y
def soustraction(x, y):
return x - y
Ce module peut ensuite être utilisé dans un autre fichier test_module.py:
import calcul
print([Link](1, 2))
La sortie affichera 3.
Pr. MERZOUK Soukaina 462
462
02/03/2025
Méthodes d’Importation des Modules
Importation d’une fonction spécifique
from calcul import addition
print(addition(1, 2))
Importation de plusieurs fonctions
from calcul import addition, soustraction
Importation de toutes les fonctions d’un module (déconseillée pour la lisibilité)
from calcul import *
print(addition(1, 2))
print(soustraction(3, 2))
Renommage d’un module lors de l’importation
import calcul as cal
Pr. MERZOUK Soukaina print([Link](1, 2)) 463
463
Chemin de Recherche des Modules
Lorsqu'un module est importé, l'interpréteur effectue la recherche
dans les modules intégrés puis dans la liste des chemins définis dans
[Link].
Pour ajouter un répertoire spécifique à cette liste :
import sys
[Link]('/home/test/’)
import calcul
print([Link](1, 2))
Pr. MERZOUK Soukaina 464
464
02/03/2025
Fichiers Byte-Compilés en Python
Lorsqu'un module est importé pour la première fois, Python le compile
en bytecode et génère un fichier avec l'extension .pyc (Python
Compiled).
Ces fichiers sont stockés dans un répertoire __pycache__ et permettent
d’accélérer l’exécution des programmes en évitant la recompilation à
chaque importation.
Pr. MERZOUK Soukaina 465
465
Fichiers Byte-Compilés en Python
Exemple :
Si un module [Link] est importé, Python crée automatiquement un
fichier compilé sous le nom __pycache__/[Link], où
XX représente la version de l'interpréteur Python utilisé.
L'utilisation des fichiers .pyc est transparente pour l'utilisateur et
optimise les performances, notamment pour les modules
fréquemment utilisés.
Pr. MERZOUK Soukaina 466
466
02/03/2025
Modules Intégrés en Python
Python propose plusieurs modules intégrés facilitant le développement.
Voici quelques-uns des plus utilisés :
math : opérations mathématiques avancées
import math
print([Link](25)) # 5.0
random : génération de nombres aléatoires
import random
print([Link](1, 10)) # Nombre aléatoire entre 1 et 10
os : interaction avec le système d’exploitation
import os
print([Link]()) # Affiche le répertoire de travail actuel
Pr. MERZOUK Soukaina 467
467
Modules Intégrés en Python
sys : manipulation des arguments et du chemin d’exécution
import os
print([Link]()) # Affiche le répertoire de travail actuel
sys : manipulation des arguments et du chemin d’exécution
import sysprint([Link]) # Affiche la version de Python
datetime : gestion des dates et heures
import datetime
print([Link]()) # Affiche la date et l’heure
actuelles
Pr. MERZOUK Soukaina 468
468
02/03/2025
Packages en Python
Un package est un répertoire contenant plusieurs modules Python et un
fichier spécial __init__.py.
Ce fichier permet à Python de reconnaître le répertoire comme un
package et peut contenir du code d'initialisation.
Pr. MERZOUK Soukaina 469
469
Packages en Python: Création d'un Package
Supposons la création d'un package mathematiques avec deux modules:
[Link] et [Link].
Créez la structure suivante :
mathematiques/
│── __init__.py
│── [Link]
│── [Link]
Ajoutez du code dans [Link] :
def addition(a, b):
return a + b
def soustraction(a, b):
Pr. MERZOUK Soukaina return a - b 470
470
02/03/2025
Packages en Python: Création d'un Package
Ajoutez du code dans [Link] :
import math
def cosinus(x):
return [Link](x)
def sinus(x):
return [Link](x)
Pr. MERZOUK Soukaina 471
471
Importer un Module d'un Package
Pour utiliser un module depuis le package mathematiques :
from mathematiques import operations
print([Link](3, 2)) # Affiche 5
On peut aussi importer une fonction spécifique :
from [Link] import sinus
print(sinus(3.14)) # Affiche un résultat proche de 0
Pr. MERZOUK Soukaina 472
472
02/03/2025
Utilisation de __init__.py
Le fichier __init__.py peut contenir du code d'initialisation pour le
package. Par exemple, pour rendre l’importation plus simple :
Dans __init__.py :
from .operations import addition, soustraction
from .trigonometre import sinus, cosinus
Ainsi, on peut directement importer le package :
import mathématiques
print([Link](5, 3)) # Affiche 8
Cette organisation en packages permet de structurer un projet en
plusieurs modules facilement réutilisables.
Pr. MERZOUK Soukaina 473
473
Exploration du Contenu d’un Module avec dir()
La fonction dir() permet d’afficher les variables et fonctions définies
dans un module.
import calcul
print(dir(calcul))
Sortie possible :
['__builtins__', '__cached__', '__doc__', '__file__',
'__loader__', '__name__', '__package__', '__spec__',
'addition', 'soustraction']
Cette fonction facilite l’exploration du contenu des modules.
Pr. MERZOUK Soukaina 474
474