SlideShare une entreprise Scribd logo
IN20 Informatique
Séance 5
Gestion d’erreurs
et mécanisme d’exception
Sébastien Combéfis, Quentin Lurkin lundi 12 octobre 2015
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
Rappels
Création d’interface graphique
Création de la fenêtre principale et de widgets
Gestionnaire de mise en page
Programmation évènementielle
Application graphique
Gestionnaire d’évènements
Le widget Canvas
3
Objectifs
Gestion d’erreurs
Programmation défensive
Spécification
Instruction assert
Mécanisme d’exception
Instruction try-except
instruction raise
Définition d’une nouvelle exception
4
Gestion d’erreurs
Trace d’erreur (1)
Une erreur d’exécution imprime une trace d’erreur
Chemin d’exécution complet qui a provoqué l’erreur
1 def percentage(grade , total):
2 return grade / total
3
4 grades = [12, 18]
5 print(’Flemal a obtenu ’, percentage(grades [0], 20), ’%’)
6 print(’Bertrand a obtenu ’, percentage(grades [1], 0), ’%’)
Flemal a obtenu 0.6 %
Traceback (most recent call last):
File "program.py", line 6, in <module >
print(’Bertrand a obtenu ’, percentage(grades [1], 0), ’%’)
File "program.py", line 2, in percentage
return score / total
ZeroDivisionError : division by zero
6
Trace d’erreur (2)
L’erreur a comme origine l’exécution de l’instruction en ligne 6
File "program.py", line 6, in <module >
print(’Bertrand a obtenu ’, percentage(grades [1], 0), ’%’)
L’erreur provient d’un appel de fonction
File "program.py", line 2, in percentage
return score / total
L’erreur est de type division par zéro
ZeroDivisionError : division by zero
7
Gestion d’erreurs
Prendre en compte tous les cas possibles d’exécution
Prévoir une valeur de retour spéciale en cas d’erreur
1 def percentage(grade , total):
2 if total > 0:
3 return grade / total
4 return 0
Flemal a obtenu 0.6 %
Bertrand a obtenu 0 %
8
Documentation informelle
La documentation d’une fonction décrit le résultat produit
Permet à un utilisateur d’interpréter le résultat de l’appel
Description de conditions sur les paramètres
Et de la valeur de retour si elles ne sont pas satisfaites
1 # Renvoie le pourcentage d’une note étant donné :
2 # - "grade" contient la note
3 # - "total" est la note maximale atteignable
4 #
5 # Si total <= 0, la fonction renvoie 0
6 def percentage(grade , total):
7 if total > 0:
8 return grade / total
9 return 0
9
Spécification (1)
Documentation formelle de fonctions avec deux éléments
Préconditions sur les paramètres
Postconditions sur la valeur de retour
Les préconditions sont à satisfaire avant l’appel
Conditions sur les paramètres ou l’état global du programme
Les postconditions seront garanties après l’appel
Pour autant que les préconditions étaient satisfaites avant l’appel
10
Spécification (2)
Plus besoin de vérifier la valeur des paramètres
On suppose que les préconditions sont satisfaites
1 # Calcul du pourcentage correspondant à une note
2 #
3 # Pre: grade > 0, la note obtenue
4 # total <= grade , la note maximale atteignable
5 # Post: la valeur renvoyée contient le pourcentage
6 # correspondant à la note obtenue
7 def percentage(grade , total):
8 return grade / total
11
Docstring
Insertion d’un docstring pour documenter la fonction
Chaine de caractères sur plusieurs lignes reconnue par Python
Doit être placé en premier dans le corps de la fonction
Automatiquement intégré dans la documentation générée
1 def percentage(grade , total):
2 """ Calcule le pourcentage correspondant à une note.
3
4 Pre: grade > 0, la note obtenue
5 grade <= total , la note maximale atteignable
6 Post: la valeur renvoyée contient le pourcentage
7 correspondant à la note obtenue
8 """
9 return grade / total
12
Outil pydoc
13
Instruction assert (1)
Vérification de conditions sensées être vraies avec assert
On vérifie notamment les préconditions avec cette instruction
Un programme doit fonctionner si on supprime les assertions
Elles ne doivent pas faire partie du code fonctionnel
1 def percentage(grade , total):
2 assert type(grade) == int and type(total) == int
3 assert total > 0, ’total doit être strictement positif ’
4 assert grade <= total , ’grade doit être inférieur à total ’
5 return grade / total
14
Instruction assert (2)
Arrêt du programme en cas d’erreur d’assertion
Avec affichage d’un message d’information
Empêche des erreurs qui ne devraient pas se produire
Le programme peut être modifié pour les éviter
1 print(’Lurkin a obtenu ’, percentage(’17’, 20), ’%’)
Traceback (most recent call last):
File "program.py", line 18, in <module >
print(’Lurkin a obtenu ’, percentage (23, 20) , ’%’)
File "program.py", line 11, in percentage
assert grade <= total , ’grade doit être inférieur à total ’
AssertionError : grade doit être inférieur à total
15
“Always code as if the guy who ends up maintaining
your code will be a violent psychopath who knows
where you live.” — Martin Golding
“Always code as if the guy who ends up maintaining
your code will be a violent psychopath who knows
where you live.” — Martin Golding
Programmation défensive (1)
Programmation défensive
Utilisation de l’instruction assert
On suppose les préconditions remplies
Peut être pratiquée
Gestion d’erreur
Utilisation de l’instruction if-else
On vérifie les conditions nécessaires sur les données
Doit être pratiquée
17
Programmation défensive (2)
Programmation défensive au sein d’un module
Se pratique sur du code dont vous avez le contrôle
Gestion d’erreur pour interface avec l’extérieur
Vérification de toutes données hors contrôle
Spécifications dans les deux cas
Le moins de préconditions possible vers l’extérieur
18
Sous-chaine (1)
Tester si s est une sous-chaine de string
À une position donnée pos dans la chaine string
Fonction auxiliaire en programmation défensive
Vérification des préconditions avec l’instruction assert
1 def _issubstringat (s, t, pos):
2 assert type(s) == str and type(t) == str and type(pos) == int
3 assert len(t) <= len(s), ’s doit être plus court que t’
4 assert pos >= 0, ’pos doit être positif ’
5 assert pos + len(t) <= len(s), ’pos trop grand ’
6 i = 0
7 while i < len(t):
8 if s[pos + i] != t[i]:
9 return False
10 i += 1
11 return True
19
Sous-chaine (2)
La fonction principale vérifie les paramètres
Renvoi de False en cas de souci
1 def issubstring(s, t):
2 if type(s) != str or type(t) != str or len(s) < len(t):
3 return False
4 i = 0
5 while i <= len(s) - len(t):
6 if _issubstringat (s, t, i):
7 return True
8 i += 1
9 return False
s
t
...
20
Mécanisme d’exception
Instruction try-except (1)
Code risqué placé dans un bloc try
N’y placer que le code risqué et tout code qui en dépend
Erreurs capturées dans le bloc except
Y placer le code à exécuter en cas de capture d’une erreur
1 from datetime import *
2
3 birthyear = input(’Année de naissance ? ’)
4
5 try:
6 now = datetime.now ()
7 age = now.year - int(birthyear)
8 print(’Tu as’, age , ’ans ’)
9 except:
10 print(’Erreur ’)
22
Instruction try-except (2)
Si l’utilisateur entre un nombre entier, pas d’erreurs
Année de naissance ? 1984
Tu as 31 ans
Si l’utilisateur n’entre pas un nombre entier, erreur capturée
Année de naissance ? BLA
Erreur
23
Validité d’une donnée
Demande d’une valeur à l’utilisateur en boucle
Tant que la valeur demandée n’est pas du bon type
1 from datetime import *
2
3 valid = False
4 while not valid:
5 birthyear = input(’Année de naissance ? ’)
6 try:
7 birthyear = int(birthyear)
8 valid = True
9 except:
10 print(’Veuillez entrer un nombre entier ’)
11
12 now = datetime.now ()
13 age = now.year - birthyear
14 print(’Tu as’, age , ’ans ’)
24
Vérifier le type d’erreur (1)
Plusieurs types d’erreur sont possibles
Division par zéro, erreur de conversion...
Toutes les erreurs sont capturées par l’instruction except
Possibilité de capturer les erreurs de manière spécifique
1 try:
2 a = int(input(’a ? ’))
3 b = int(input(’b ? ’))
4 print(a, ’/’, b, ’=’, a / b)
5 except:
6 print(’Erreur ’)
25
Vérifier le type d’erreur (2)
Une exception est un objet qui représente une erreur
L’objet est généralement de type Exception
Types spécifiques pour différencier les types d’erreurs
ZeroDivisionError, ValueError...
1 import sys
2
3 try:
4 a = int(input(’a ? ’))
5 b = int(input(’b ? ’))
6 print(a, ’/’, b, ’=’, a / b)
7 except Exception as e:
8 print(type(e))
9 print(e)
26
Vérifier le type d’erreur (3)
Division par zéro
a ? deux
<class ’ValueError ’>
invalid literal for int () with base 10: ’deux ’
Erreur de conversion
a ? 2
b ? 0
<class ’ZeroDivisionError ’>
division by zero
27
Capturer une erreur spécifique (1)
Gestionnaire d’erreurs différent pour chaque type d’erreur
Il suffit de déclarer un bloc except par erreur à capturer
Attention à l’ordre de capture (de haut en bas)
Il faut classer les erreurs de la plus à la moins spécificité
1 import sys
2
3 try:
4 a = int(input(’a ? ’))
5 b = int(input(’b ? ’))
6 print(a, ’/’, b, ’=’, a / b)
7 except ValueError:
8 print(’Erreur de conversion ’)
9 except ZeroDivisionError :
10 print(’Division par zéro ’)
11 except:
12 print(’Autre erreur ’)
28
Capturer une erreur spécifique (2)
1 import sys
2
3 try:
4 a = int(input(’a ? ’))
5 b = int(input(’b ? ’))
6 print(a, ’/’, b, ’=’, a / b)
7 except Exception:
8 print(’Erreur ’)
9 except ValueError:
10 print(’Erreur de conversion ’)
11 except ZeroDivisionError :
12 print(’Division par zéro ’)
a ? 2
b ? 0
Autre erreur
29
Information sur une erreur
L’objet de l’exception peut contenir de l’information
On peut accéder à des propriétés ou à des méthodes
1 try:
2 import mymod
3 except SyntaxError as e:
4 print(e)
5 print(’File:’, e.filename)
6 print(’Line:’, e.lineno)
7 print(’Text:’, e.text)
can ’t assign to literal (mymod.py , line 1)
File: /Users/combefis/Desktop/mymod.py
Line: 1
Text: 2 = x
30
Gestionnaire d’erreurs partagé
Même gestionnaire d’erreurs pour différents types
Tuple d’exception fourni à l’instruction except
1 try:
2 a = int(input(’a ? ’))
3 b = int(input(’b ? ’))
4 print(a / b)
5 except (ZeroDivisionError , ValueError):
6 print(’Erreur de calcul ’)
7 except:
8 print(’Erreur ’)
a ? 1
b ? 0
Erreur de calcul
31
Générer une erreur
L’instruction raise permet de générer une erreur
Création d’un objet du type de l’exception
1 def power2(x):
2 if x < 0:
3 raise ArithmeticError ()
4 return 2 ** x
5
6 try:
7 print(power2 (-2))
8 except ArithmeticError :
9 print(’Puissance négative de 2 interdite ’)
10 except:
11 print(’Erreur ’)
Erreur
32
Définir une erreur (1)
Définition d’une erreur en définissant une nouvelle classe
La classe est créée à partir de la classe Exception
L’instruction pass ne fait rien
1 from math import sqrt
2
3 class NoRootException (Exception):
4 pass
5
6 def trinomialroots (a, b, c):
7 delta = b ** 2 - 4 * a * c
8 if delta < 0:
9 raise NoRootException ()
10 if delta == 0:
11 return -b / (2 * a)
12 x1 = (-b + sqrt(delta)) / (2 * a)
13 x2 = (-b - sqrt(delta)) / (2 * a)
14 return (x1 , x2)
33
Définir une erreur (2)
Capture de la nouvelle erreur avec l’instruction except
Le nouveau type d’erreur est maintenant connu par Python
1 try:
2 print( trinomialroots (1, 0, 2))
3 except NoRootException :
4 print(’Pas de racine réelle.’)
5 except:
6 print(’Erreur ’)
Pas de racine réelle.
34
Exception paramétrée
Stockage d’un paramètre dans l’exception
1 class NoRootException (Exception):
2 def __init__(self , delta):
3 self.__delta = delta
4
5 @property
6 def delta(self):
7 return self.__delta
8
9 def trinomialroots (a, b, c):
10 # ...
11 if delta < 0:
12 raise NoRootException (delta)
13 # ...
14 except NoRootException as e:
15 print(’Pas de racine réelle (delta = ’, e.delta , ’)’, sep=’’)
Pas de racine réelle (delta = -8)
35
Quand utiliser les erreurs ?
Toujours vérifier les données provenant de l’extérieur
Lecture avec input, lecture d’un fichier...
Lors d’un appel à une fonction d’un module
Lire la documentation de la fonction, pour les erreurs potentielles
Quand on définit une librairie
Pour les fonctions publiques offertes à l’extérieur
36
Crédits
https://www.flickr.com/photos/mstibbetts/1401175133
http://www.flickr.com/photos/tetezinharomana/7152072635/
https://www.flickr.com/photos/mbiskoping/510673513
37

Contenu connexe

Tendances

Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
ECAM Brussels Engineering School
 
FormationPython2019.pptx
FormationPython2019.pptxFormationPython2019.pptx
FormationPython2019.pptx
LamissGhoul1
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
Aziz Darouichi
 
Formation python
Formation pythonFormation python
Formation python
j_lipaz
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
ECAM Brussels Engineering School
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
Shellmates
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
Haytam EL YOUSSFI
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
Maya Medjdoub
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
pierrepo
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 
Algorithmique et Structures de Données II
Algorithmique et Structures de Données IIAlgorithmique et Structures de Données II
Algorithmique et Structures de Données II
Riadh Bouslimi
 
Cours python
Cours pythonCours python
Cours python
salmazen
 
Examen sybase - Administration base de donnees
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donnees
webreaker
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - Correction
Lilia Sfaxi
 
Python.pptx
Python.pptxPython.pptx
Python.pptx
Jaouad Rachek
 
Diagramme de Séquence
Diagramme de SéquenceDiagramme de Séquence
Diagramme de Séquence
abdoMarocco
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
webreaker
 
POO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 EncapsulationPOO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 Encapsulation
Mouna Torjmen
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
Aziz Darouichi
 
L’algorithme 1.pptx
L’algorithme 1.pptxL’algorithme 1.pptx
L’algorithme 1.pptx
Okanimegamers
 

Tendances (20)

Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
FormationPython2019.pptx
FormationPython2019.pptxFormationPython2019.pptx
FormationPython2019.pptx
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
Formation python
Formation pythonFormation python
Formation python
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Algorithmique et Structures de Données II
Algorithmique et Structures de Données IIAlgorithmique et Structures de Données II
Algorithmique et Structures de Données II
 
Cours python
Cours pythonCours python
Cours python
 
Examen sybase - Administration base de donnees
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donnees
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - Correction
 
Python.pptx
Python.pptxPython.pptx
Python.pptx
 
Diagramme de Séquence
Diagramme de SéquenceDiagramme de Séquence
Diagramme de Séquence
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
 
POO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 EncapsulationPOO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 Encapsulation
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
 
L’algorithme 1.pptx
L’algorithme 1.pptxL’algorithme 1.pptx
L’algorithme 1.pptx
 

En vedette

Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
ECAM Brussels Engineering School
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
ECAM Brussels Engineering School
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
ECAM Brussels Engineering School
 
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
ECAM Brussels Engineering School
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
ECAM Brussels Engineering School
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
ECAM Brussels Engineering School
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
ECAM Brussels Engineering School
 
Arbre et algorithme de recherche
Arbre et algorithme de rechercheArbre et algorithme de recherche
Arbre et algorithme de recherche
ECAM Brussels Engineering School
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
ECAM Brussels Engineering School
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
ECAM Brussels Engineering School
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
ECAM Brussels Engineering School
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
ECAM Brussels Engineering School
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
ECAM Brussels Engineering School
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
ECAM Brussels Engineering School
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
ECAM Brussels Engineering School
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
ECAM Brussels Engineering School
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
ECAM Brussels Engineering School
 

En vedette (20)

Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
 
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Arbre et algorithme de recherche
Arbre et algorithme de rechercheArbre et algorithme de recherche
Arbre et algorithme de recherche
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 

Similaire à Python avancé : Gestion d'erreurs et mécanisme d'exception

Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
ECAM Brussels Engineering School
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
Gonéri Le Bouder
 
Cours c#
Cours c#Cours c#
Cours c#
zan
 
Test de logiciels
Test de logiciels Test de logiciels
Test de logiciels
Bilel Abed
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
Alexandre Hamez
 
Les bases de la programmation en JAVA
Les bases de la programmation  en JAVA   Les bases de la programmation  en JAVA
Les bases de la programmation en JAVA
Asmaa BENGUEDDACH
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
Ruau Mickael
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
ECAM Brussels Engineering School
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech days
Jean-Pierre Vincent
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
Microsoft
 
BEBUTANT JAVA
BEBUTANT  JAVABEBUTANT  JAVA
BEBUTANT JAVA
violonjo
 
Algorithmique&Langage C Partie-2 BTS.pptx
Algorithmique&Langage C Partie-2 BTS.pptxAlgorithmique&Langage C Partie-2 BTS.pptx
Algorithmique&Langage C Partie-2 BTS.pptx
Facebokma
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
ENSET, Université Hassan II Casablanca
 
3 vb reference
3 vb reference3 vb reference
3 vb reference
kkatia31
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
Ruau Mickael
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
Hichem Kemali
 
Les structures de données.pptx
Les structures de données.pptxLes structures de données.pptx
Les structures de données.pptx
PROFPROF11
 

Similaire à Python avancé : Gestion d'erreurs et mécanisme d'exception (20)

Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
Cours c#
Cours c#Cours c#
Cours c#
 
Test de logiciels
Test de logiciels Test de logiciels
Test de logiciels
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Les bases de la programmation en JAVA
Les bases de la programmation  en JAVA   Les bases de la programmation  en JAVA
Les bases de la programmation en JAVA
 
Theme 7
Theme 7Theme 7
Theme 7
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech days
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
BEBUTANT JAVA
BEBUTANT  JAVABEBUTANT  JAVA
BEBUTANT JAVA
 
Algorithmique&Langage C Partie-2 BTS.pptx
Algorithmique&Langage C Partie-2 BTS.pptxAlgorithmique&Langage C Partie-2 BTS.pptx
Algorithmique&Langage C Partie-2 BTS.pptx
 
C4 fonctions
C4 fonctionsC4 fonctions
C4 fonctions
 
Theme 6
Theme 6Theme 6
Theme 6
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
3 vb reference
3 vb reference3 vb reference
3 vb reference
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
 
Les structures de données.pptx
Les structures de données.pptxLes structures de données.pptx
Les structures de données.pptx
 

Plus de ECAM Brussels Engineering School

Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
ECAM Brussels Engineering School
 
Laboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetLaboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projet
ECAM Brussels Engineering School
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnel
ECAM Brussels Engineering School
 
Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...
ECAM Brussels Engineering School
 
Intelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielleIntelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielle
ECAM Brussels Engineering School
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
ECAM Brussels Engineering School
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
ECAM Brussels Engineering School
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
ECAM Brussels Engineering School
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
ECAM Brussels Engineering School
 

Plus de ECAM Brussels Engineering School (10)

Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
 
Laboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetLaboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projet
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnel
 
Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...
 
Intelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielleIntelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielle
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
 

Python avancé : Gestion d'erreurs et mécanisme d'exception

  • 1. IN20 Informatique Séance 5 Gestion d’erreurs et mécanisme d’exception Sébastien Combéfis, Quentin Lurkin lundi 12 octobre 2015
  • 2. Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
  • 3. Rappels Création d’interface graphique Création de la fenêtre principale et de widgets Gestionnaire de mise en page Programmation évènementielle Application graphique Gestionnaire d’évènements Le widget Canvas 3
  • 4. Objectifs Gestion d’erreurs Programmation défensive Spécification Instruction assert Mécanisme d’exception Instruction try-except instruction raise Définition d’une nouvelle exception 4
  • 6. Trace d’erreur (1) Une erreur d’exécution imprime une trace d’erreur Chemin d’exécution complet qui a provoqué l’erreur 1 def percentage(grade , total): 2 return grade / total 3 4 grades = [12, 18] 5 print(’Flemal a obtenu ’, percentage(grades [0], 20), ’%’) 6 print(’Bertrand a obtenu ’, percentage(grades [1], 0), ’%’) Flemal a obtenu 0.6 % Traceback (most recent call last): File "program.py", line 6, in <module > print(’Bertrand a obtenu ’, percentage(grades [1], 0), ’%’) File "program.py", line 2, in percentage return score / total ZeroDivisionError : division by zero 6
  • 7. Trace d’erreur (2) L’erreur a comme origine l’exécution de l’instruction en ligne 6 File "program.py", line 6, in <module > print(’Bertrand a obtenu ’, percentage(grades [1], 0), ’%’) L’erreur provient d’un appel de fonction File "program.py", line 2, in percentage return score / total L’erreur est de type division par zéro ZeroDivisionError : division by zero 7
  • 8. Gestion d’erreurs Prendre en compte tous les cas possibles d’exécution Prévoir une valeur de retour spéciale en cas d’erreur 1 def percentage(grade , total): 2 if total > 0: 3 return grade / total 4 return 0 Flemal a obtenu 0.6 % Bertrand a obtenu 0 % 8
  • 9. Documentation informelle La documentation d’une fonction décrit le résultat produit Permet à un utilisateur d’interpréter le résultat de l’appel Description de conditions sur les paramètres Et de la valeur de retour si elles ne sont pas satisfaites 1 # Renvoie le pourcentage d’une note étant donné : 2 # - "grade" contient la note 3 # - "total" est la note maximale atteignable 4 # 5 # Si total <= 0, la fonction renvoie 0 6 def percentage(grade , total): 7 if total > 0: 8 return grade / total 9 return 0 9
  • 10. Spécification (1) Documentation formelle de fonctions avec deux éléments Préconditions sur les paramètres Postconditions sur la valeur de retour Les préconditions sont à satisfaire avant l’appel Conditions sur les paramètres ou l’état global du programme Les postconditions seront garanties après l’appel Pour autant que les préconditions étaient satisfaites avant l’appel 10
  • 11. Spécification (2) Plus besoin de vérifier la valeur des paramètres On suppose que les préconditions sont satisfaites 1 # Calcul du pourcentage correspondant à une note 2 # 3 # Pre: grade > 0, la note obtenue 4 # total <= grade , la note maximale atteignable 5 # Post: la valeur renvoyée contient le pourcentage 6 # correspondant à la note obtenue 7 def percentage(grade , total): 8 return grade / total 11
  • 12. Docstring Insertion d’un docstring pour documenter la fonction Chaine de caractères sur plusieurs lignes reconnue par Python Doit être placé en premier dans le corps de la fonction Automatiquement intégré dans la documentation générée 1 def percentage(grade , total): 2 """ Calcule le pourcentage correspondant à une note. 3 4 Pre: grade > 0, la note obtenue 5 grade <= total , la note maximale atteignable 6 Post: la valeur renvoyée contient le pourcentage 7 correspondant à la note obtenue 8 """ 9 return grade / total 12
  • 14. Instruction assert (1) Vérification de conditions sensées être vraies avec assert On vérifie notamment les préconditions avec cette instruction Un programme doit fonctionner si on supprime les assertions Elles ne doivent pas faire partie du code fonctionnel 1 def percentage(grade , total): 2 assert type(grade) == int and type(total) == int 3 assert total > 0, ’total doit être strictement positif ’ 4 assert grade <= total , ’grade doit être inférieur à total ’ 5 return grade / total 14
  • 15. Instruction assert (2) Arrêt du programme en cas d’erreur d’assertion Avec affichage d’un message d’information Empêche des erreurs qui ne devraient pas se produire Le programme peut être modifié pour les éviter 1 print(’Lurkin a obtenu ’, percentage(’17’, 20), ’%’) Traceback (most recent call last): File "program.py", line 18, in <module > print(’Lurkin a obtenu ’, percentage (23, 20) , ’%’) File "program.py", line 11, in percentage assert grade <= total , ’grade doit être inférieur à total ’ AssertionError : grade doit être inférieur à total 15
  • 16. “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.” — Martin Golding “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.” — Martin Golding
  • 17. Programmation défensive (1) Programmation défensive Utilisation de l’instruction assert On suppose les préconditions remplies Peut être pratiquée Gestion d’erreur Utilisation de l’instruction if-else On vérifie les conditions nécessaires sur les données Doit être pratiquée 17
  • 18. Programmation défensive (2) Programmation défensive au sein d’un module Se pratique sur du code dont vous avez le contrôle Gestion d’erreur pour interface avec l’extérieur Vérification de toutes données hors contrôle Spécifications dans les deux cas Le moins de préconditions possible vers l’extérieur 18
  • 19. Sous-chaine (1) Tester si s est une sous-chaine de string À une position donnée pos dans la chaine string Fonction auxiliaire en programmation défensive Vérification des préconditions avec l’instruction assert 1 def _issubstringat (s, t, pos): 2 assert type(s) == str and type(t) == str and type(pos) == int 3 assert len(t) <= len(s), ’s doit être plus court que t’ 4 assert pos >= 0, ’pos doit être positif ’ 5 assert pos + len(t) <= len(s), ’pos trop grand ’ 6 i = 0 7 while i < len(t): 8 if s[pos + i] != t[i]: 9 return False 10 i += 1 11 return True 19
  • 20. Sous-chaine (2) La fonction principale vérifie les paramètres Renvoi de False en cas de souci 1 def issubstring(s, t): 2 if type(s) != str or type(t) != str or len(s) < len(t): 3 return False 4 i = 0 5 while i <= len(s) - len(t): 6 if _issubstringat (s, t, i): 7 return True 8 i += 1 9 return False s t ... 20
  • 22. Instruction try-except (1) Code risqué placé dans un bloc try N’y placer que le code risqué et tout code qui en dépend Erreurs capturées dans le bloc except Y placer le code à exécuter en cas de capture d’une erreur 1 from datetime import * 2 3 birthyear = input(’Année de naissance ? ’) 4 5 try: 6 now = datetime.now () 7 age = now.year - int(birthyear) 8 print(’Tu as’, age , ’ans ’) 9 except: 10 print(’Erreur ’) 22
  • 23. Instruction try-except (2) Si l’utilisateur entre un nombre entier, pas d’erreurs Année de naissance ? 1984 Tu as 31 ans Si l’utilisateur n’entre pas un nombre entier, erreur capturée Année de naissance ? BLA Erreur 23
  • 24. Validité d’une donnée Demande d’une valeur à l’utilisateur en boucle Tant que la valeur demandée n’est pas du bon type 1 from datetime import * 2 3 valid = False 4 while not valid: 5 birthyear = input(’Année de naissance ? ’) 6 try: 7 birthyear = int(birthyear) 8 valid = True 9 except: 10 print(’Veuillez entrer un nombre entier ’) 11 12 now = datetime.now () 13 age = now.year - birthyear 14 print(’Tu as’, age , ’ans ’) 24
  • 25. Vérifier le type d’erreur (1) Plusieurs types d’erreur sont possibles Division par zéro, erreur de conversion... Toutes les erreurs sont capturées par l’instruction except Possibilité de capturer les erreurs de manière spécifique 1 try: 2 a = int(input(’a ? ’)) 3 b = int(input(’b ? ’)) 4 print(a, ’/’, b, ’=’, a / b) 5 except: 6 print(’Erreur ’) 25
  • 26. Vérifier le type d’erreur (2) Une exception est un objet qui représente une erreur L’objet est généralement de type Exception Types spécifiques pour différencier les types d’erreurs ZeroDivisionError, ValueError... 1 import sys 2 3 try: 4 a = int(input(’a ? ’)) 5 b = int(input(’b ? ’)) 6 print(a, ’/’, b, ’=’, a / b) 7 except Exception as e: 8 print(type(e)) 9 print(e) 26
  • 27. Vérifier le type d’erreur (3) Division par zéro a ? deux <class ’ValueError ’> invalid literal for int () with base 10: ’deux ’ Erreur de conversion a ? 2 b ? 0 <class ’ZeroDivisionError ’> division by zero 27
  • 28. Capturer une erreur spécifique (1) Gestionnaire d’erreurs différent pour chaque type d’erreur Il suffit de déclarer un bloc except par erreur à capturer Attention à l’ordre de capture (de haut en bas) Il faut classer les erreurs de la plus à la moins spécificité 1 import sys 2 3 try: 4 a = int(input(’a ? ’)) 5 b = int(input(’b ? ’)) 6 print(a, ’/’, b, ’=’, a / b) 7 except ValueError: 8 print(’Erreur de conversion ’) 9 except ZeroDivisionError : 10 print(’Division par zéro ’) 11 except: 12 print(’Autre erreur ’) 28
  • 29. Capturer une erreur spécifique (2) 1 import sys 2 3 try: 4 a = int(input(’a ? ’)) 5 b = int(input(’b ? ’)) 6 print(a, ’/’, b, ’=’, a / b) 7 except Exception: 8 print(’Erreur ’) 9 except ValueError: 10 print(’Erreur de conversion ’) 11 except ZeroDivisionError : 12 print(’Division par zéro ’) a ? 2 b ? 0 Autre erreur 29
  • 30. Information sur une erreur L’objet de l’exception peut contenir de l’information On peut accéder à des propriétés ou à des méthodes 1 try: 2 import mymod 3 except SyntaxError as e: 4 print(e) 5 print(’File:’, e.filename) 6 print(’Line:’, e.lineno) 7 print(’Text:’, e.text) can ’t assign to literal (mymod.py , line 1) File: /Users/combefis/Desktop/mymod.py Line: 1 Text: 2 = x 30
  • 31. Gestionnaire d’erreurs partagé Même gestionnaire d’erreurs pour différents types Tuple d’exception fourni à l’instruction except 1 try: 2 a = int(input(’a ? ’)) 3 b = int(input(’b ? ’)) 4 print(a / b) 5 except (ZeroDivisionError , ValueError): 6 print(’Erreur de calcul ’) 7 except: 8 print(’Erreur ’) a ? 1 b ? 0 Erreur de calcul 31
  • 32. Générer une erreur L’instruction raise permet de générer une erreur Création d’un objet du type de l’exception 1 def power2(x): 2 if x < 0: 3 raise ArithmeticError () 4 return 2 ** x 5 6 try: 7 print(power2 (-2)) 8 except ArithmeticError : 9 print(’Puissance négative de 2 interdite ’) 10 except: 11 print(’Erreur ’) Erreur 32
  • 33. Définir une erreur (1) Définition d’une erreur en définissant une nouvelle classe La classe est créée à partir de la classe Exception L’instruction pass ne fait rien 1 from math import sqrt 2 3 class NoRootException (Exception): 4 pass 5 6 def trinomialroots (a, b, c): 7 delta = b ** 2 - 4 * a * c 8 if delta < 0: 9 raise NoRootException () 10 if delta == 0: 11 return -b / (2 * a) 12 x1 = (-b + sqrt(delta)) / (2 * a) 13 x2 = (-b - sqrt(delta)) / (2 * a) 14 return (x1 , x2) 33
  • 34. Définir une erreur (2) Capture de la nouvelle erreur avec l’instruction except Le nouveau type d’erreur est maintenant connu par Python 1 try: 2 print( trinomialroots (1, 0, 2)) 3 except NoRootException : 4 print(’Pas de racine réelle.’) 5 except: 6 print(’Erreur ’) Pas de racine réelle. 34
  • 35. Exception paramétrée Stockage d’un paramètre dans l’exception 1 class NoRootException (Exception): 2 def __init__(self , delta): 3 self.__delta = delta 4 5 @property 6 def delta(self): 7 return self.__delta 8 9 def trinomialroots (a, b, c): 10 # ... 11 if delta < 0: 12 raise NoRootException (delta) 13 # ... 14 except NoRootException as e: 15 print(’Pas de racine réelle (delta = ’, e.delta , ’)’, sep=’’) Pas de racine réelle (delta = -8) 35
  • 36. Quand utiliser les erreurs ? Toujours vérifier les données provenant de l’extérieur Lecture avec input, lecture d’un fichier... Lors d’un appel à une fonction d’un module Lire la documentation de la fonction, pour les erreurs potentielles Quand on définit une librairie Pour les fonctions publiques offertes à l’extérieur 36