Institut Supérieur d’Informatique de Mahdia
Programmation Avancée en Python
Mme. Amal Gassara
Auditoire: LCS - GLSI
Année universitaire: 2024/2025
Chapitre 3
Persistance des données
Gestion des exceptions
Définition d’une exception
Une exception est un objet qui indique que le programme ne peut pas
continuer son exécution.
Exemple: Ci-dessous le code de la fonction division
def division(x,y):
resultat=x/y
print (resultat)
print("Division terminée")
#Programme Principal
division(1,0)
Lorsque x == 0, le programme effectue une division par zéro. Alors, il
s’arrête et déclenche une erreur.
L’instruction print("Division terminée") n’était pas exécutée
3
Gestion des exceptions
Principe des exceptions
La gestion des exceptions est un concept très utilisé dans d'autres langages de
programmation (orientés objet) comme Java, PHP , etc
Le mécanisme des exceptions permet au programme de « rattraper » les
erreurs, de détecter qu’une erreur s’est produite et d’agir en conséquence afin
que le programme ne s’arrête pas.
Afin de rattraper l’erreur, on place le code qui peut générer une erreur
éventuelle dans le bloc try et on prévoie un traitement alternatif dans le
bloc except.
4
Gestion des exceptions
Syntaxe:
try: #La clause try
<instructions_ susceptible_de_produire_une_erreur>
except <type_exception> : #La clause except
<instruction_à_exécuter_si_une_exception_se_déclenche>
La clause try est exécutée au début.
Si le bloc try ne génère aucune erreur, alors le bloc except sera ignoré.
Sinon, le bloc except sera exécuté pour rattraper l'erreur du bloc try. Le reste
de ce dernier (le bloc try) est ignoré.
Si le type d'exception levée correspond à un nom indiqué après l’instruction
except, la clause except correspondante est exécutée. Puis l'exécution du
programme continue après l'instruction try.
5
Gestion des exceptions
Alors, on va modifier le code de la fonction division de manière qu’elle
rattrape l’erreur comme suit :
def division(x,y):
try:#La clause de try
resultat=x/y
print (resultat)
except ZeroDivisionError:#La clause except
print ("Attention division par zero!")
print("Division terminée")
#Programme Principal
division(1,0)
6
Gestion des exceptions
Exemple 2
def division(x,y):
try:
return x/y
except TypeError:
print("Attention type de variable erroné")
#Programme Principal
division(1,"2")
Attention type de variable erroné
division(1,0)
File "<pyshell#24>", line 3, in division return x/y
ZeroDivisionError: division by zero
Si le type de l’exception déclenchée ne correspond à aucune exception
mentionnée dans la clause except, l'exécution s'arrête avec un message.
7
Gestion des exceptions
Exemple 3
On peut la corriger de cette manière:
def division(x,y):
try:
return x/y
except ZeroDivisionError:
print("Attention division par zero!")
except TypeError:
print("Attention type de variable erroné")
except Exception:
print("Attention une erreur s’est produite")
#Programme Principal
division(1,0)
Attention division par zero
division(1,"2")
Attention type de variable erroné
division(1,0,3)
Attention une erreur s’est produite
8
Gestion des exceptions
Une liste des exceptions natives et leur signification se trouve dans le lien
suivant:
https://docs.python.org/fr/3/library/exceptions.html#bltin-exceptions
Exemples:
TypeError
NameError
SyntaxError
9
Gestion des exceptions
Finally
On utilise le mot clé finally pour exécuter des instructions quelque soit
les erreurs générées ou non (et même si il y a présence d'un return ).
Dans tous les cas les instructions placées dans finally seront exécutées.
10
Gestion des exceptions
Exemple d’utilisation de else:
def division(x,y): def division(x,y):
try: try:
result= x/y result= x/y
except ZeroDivisionError: except ZeroDivisionError:
print("Attention division par zero!") print("Attention division par zero!")
print(result) else :
print(result)
#Programme Principal
division(1,1) #Programme Principal
1.1 division(1,1)
Division (1,0) 1.1
Division (1,0)
Attention division par zero!
UnboundLocalError: local variable 'result' Attention division par zero!
referenced before assignment
11
Gestion des exceptions
Exemple avec else et finally:
def division(x,y): def division(x,y):
try: try:
result= x/y result= x/y
except ZeroDivisionError: except ZeroDivisionError:
print("Attention division par zero!") print("Attention division par zero!")
else : else :
print(result) print(result)
print("Fin Programme") finally:
print("Fin Programme")
#Programme Principal
division(1,0) #Programme Principal
Attention division par zero! division(1,0)
Fin Programme Attention division par zero!
Fin Programme
division ("3", 2) Division ("3", 2)
TypeError: unsupported operand Fin Programme
type(s) for /: 'str' and 'int' TypeError: unsupported operand
type(s) for /: 'str' and 'int' 12
Lever des exceptions manuellement
Si on souhaite appliquer une règle spécifique à notre programme pour
interdire un certain fonctionnement.
Exemple: un programme qui vérifie le mot de passe d’un utilisateur, si elle
est incorrect, une exception est déclenchée
mot_de_passe = input("C'est quoi le mot de passe ?")
if mot_de_passe != "1234":
raise Exception("Intrus !")
else:
print("Bienvenue !")
Grâce au mot clé raise, nous avons manuellement levé une exception
13
Lever des exceptions manuellement
Rattraper l’exception
try:
mot_de_passe = input("C'est quoi le mot de passe ?")
if mot_de_passe != "1234":
raise Exception("Intrus !")
else:
print("Bienvenue !")
except Exception as e:
print("Accès refusé :", e)
C'est quoi le mot de passe ?1234
Bienvenue !
C'est quoi le mot de passe ?12
Accès refusé : Intrus !
14
Lever des exceptions manuellement
Exercice: Fonction contrôlant le type des paramètres
Écrivez la fonction dire_bonjour(nom) qui affiche sur la console « Bonjour »
suivi du nom passé en paramètre.
Complétez la fonction ci-dessous pour que l’appel échoue avec une
exception si le paramètre nom n’est pas une chaîne de caractères ou si la
chaîne de caractères est vide
def dire_bonjour(nom):
# TODO
print("Bonjour", nom)
15
Lever des exceptions manuellement
def dire_bonjour(nom):
try:
if not isinstance(nom, str) or nom == "": #ou type(nom) != str
raise ValueError("'nom' doit être de type str non vide")
print("Bonjour", nom)
except ValueError as e:
print("Erreur :", e)
dire_bonjour("Alice")# Affiche : Bonjour Alice
dire_bonjour(123) # Affiche : Erreur : 'nom' doit être de type
str non vide.
dire_bonjour("") # Affiche : Erreur : 'nom' doit être de type
str non vide.
16
Lever des exceptions manuellement
def dire_bonjour(nom):
if not isinstance(nom, str) or nom == "":
raise ValueError("'nom' doit être de type str non vide")
print("Bonjour", nom)
try:
dire_bonjour("Alice") # Affiche: Bonjour Alice
dire_bonjour(123) # Lève une exception
dire_bonjour("") # Lève une exception
except ValueError as e:
print("Erreur :", e)
17
Gestion de la base
des données
Introduction
Deux modes de stockage des données sont envisageables :
Des fichiers
Une base de données
Le mode de stockage dans des fichiers est très simple à mettre en
œuvre.
Si les informations à traiter atteignent un certain volume, l'usage d'une
base de données est fortement recommandé.
Gestion de la base des données
Qu’est ce qu’une base de données
Une base de données est un conteneur dans lequel il est possible de stocker des
données de façon structurée.
Un langage standardisé -SQL- est dédié à cette structure et permet aussi bien
de faire des recherches mais aussi des modifications ou des suppressions.
Parmi les logiciels de gestion de bases de données utilisées, on trouve les
SGBDR - Système de gestion de base de données relationnelles –
Exemples: MySQL, PostgreSQL, MariaDB, SQLite, Oracle
20
Gestion de la base des données
Quels sont les SGBDR les plus connus?
PostgreSQL PostgreSQL est la base de données à utiliser pour les gros projets. Stable et très
puissant, il permet de gérer des Gigabytes de données sans problème.
MySQL Mysql est l'un des SGBDR les plus utilisés au monde. Il est gratuit, libre et très
puissant Il répond à une logique client/serveur , c'est à dire que plusieurs clients
(ordinateurs distants) peuvent se connecter sur un seul serveur qui héberge les
données.
MariaDB Le créateur de MySQL a crée MariaDB suite au rachat de MySQL pour continuer le
projet en open source.
SQLite SQLite est une bibliothèque écrite en C . SQLite est parfait pour les petits projets. Sa
particularité est d'être intégré directement à un programme et ne répond donc pas
à la logique client-serveur.
Il peut être intégré à des projets tournant sur de petites supports comme les
smartphones.
Oracle Oracle Database est sous licence propriétaire, c'est à dire payant. Il est souvent
utilisé pour les projets à gros budget nécessitant de réaliser des actions complexes.
21
SQLite
Utiliser le module SQLite
Instructions de base sous python
Pour importer le module SQLite:
import sqlite3 as sq
Pour créer et se connecter à une base de données avec SQLite:
connection = sq.connect('ma_base.db')
Les bases créées avec sqlite3 sont enregistrées sous forme de fichier .db. Ce
fichier s’ouvre en créant un objet de type Connection.
Pour exécuter des commandes:
cursor = connection.cursor()
requete= ("SELECT * FROM Vente")
cursor.execute(requete)
22
SQLite
Un curseur est ensuite crée à partir de l’objet connection de la classe
Connection. Ce curseur représente un canal entre la base de données et le
script Python.
Pour exécuter des commandes dans la base, on crée des requetés sql sous
forme de chaines de caractères. Ensuite, on les exécute avec la fonction
execute()
Lorsque le travail prévu est terminé, il est nécessaire d’enregistrer les
modifications faites sur la base avec la méthode commit()
Enfin, il faut fermer la connexion vers la base
Pour fermer la connexion:
connection.close()
23
SQLite
Créer une table avec SQLite
Voici un exemple de création de table:
cursor = connection.cursor()
cursor.execute(""" CREATE TABLE users(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT, age INTERGER)""")
connection.commit()
On utiliser primary key pour indiquer la clé primaire
On utilise autoincrement, si la clé primaire s’incrémente automatiquement,
elle n’est pas donnée par l’utilisateur.
On utilise foreign key pour indiquer une clé étrangère
cursor.execute(""" CREATE TABLE users(id integer PRIMARY KEY, idArticle integer, name
TEXT, age INTERGER, foreign key (idArtcile) references Artcile(idArtcile))""")
24
SQLite
Supprimer une table avec SQLite
Voici un exemple de suppression d’une table:
cursor = connection.cursor()
cursor.execute("DROP TABLE users")
connection.commit()
25
SQLite
Insérer des données
Il existe plusieurs manière d'insérer des données,
La plus simple étant celle-ci:
cursor.execute("INSERT INTO users (name, age) VALUES ("olivier", 30) ")
connection.commit()
Ou encore:
X="Olivier"
Y=30
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?) ", (x,y) )
connection.commit()
En passant par un dictionnaire
data = {"nom" : "olivier", "age" : 30}
cursor.execute("INSERT INTO users(name, age) VALUES(:nom, :age)", data)
connection.commit()
26
SQLite
Il est également possible de faire plusieurs insert en une seule fois avec la
fonction executemany :
users = []
users.append(("olivier", 30))
users.append(("jean-louis", 90))
#ou bien users=[ ("olivier", 30) , ("jean-louis", 90) ]
cursor.executemany("INSERT INTO users(name, age) VALUES(?, ?)", users)
27
SQLite
Récupérer des données
La requête SELECT demande l’extraction d’un ensemble particulier
d’enregistrement, qui devront être transférés de la base de données au curseur.
Récupérer une seule ligne: On peut récupérer la première ligne correspondant
à une recherche à l'aide de la fonction fetchone()
cursor.execute("SELECT * FROM users") Le résultat est un tuple:
user1 = cursor.fetchone() (1, 'olivier', 30)
print(user1)
Récupérer plusieurs lignes: On peut récupérer plusieurs données de la même
recherche en utilisant la fonction fetchall()
1ère méthode
cursor.execute("SELECT id, name, age FROM users")
rows = cursor.fetchall() Le résultat est une liste de tuples:
print(rows) [(1, 'olivier', 30) , (2, ' jean-louis ', 90)]
for row in rows:
(1, 'olivier', 30)
print(row) 28
(2, ' jean-louis ', 90)
SQLite
2ème méthode (sans utiliser fetchall()
L'objet curseur fonctionne comme un itérateur, invoquant la méthode
fetchall() automatiquement:
cursor.execute("SELECT id, name, age FROM users") Le résultat est une liste de tuples:
for row in cursor: (1, 'olivier', 30)
print(row) (2, ' jean-louis ', 90)
Pour la recherche spécifique, on utilise la même logique vu précédemment:
id = 2
cursor.execute("SELECT id, name FROM users WHERE id=?", (id, ))
response = cursor.fetchone()
print(response)
Modifier des entrées
Pour modifier des entrées:
age=31
cursor.execute("UPDATE users SET age = ? WHERE id = 2", (age, ))
29
connection.commit()
SQLite
Gestion des exceptions
Il est recommandé de toujours encadrer les opérations sur des bases de
données et d'anticiper des erreurs:
import sqlite3
try:
connnection = sqlite3.connect('users.db')
cursor = connection.cursor()
cursor.execute("create TABLE users ( id integer primary key , name TEXT, age integer)")
connection.commit()
except sqlite3.DatabaseError as e:
print("Erreur", e)
finally:
connection.close()