N.B. Niveau : Terminale S, enseignement de spécialité ISN (Informatique et Sciences du Numérique)
Ce cours a été testé sous Windows et GNU/Linux avec Python version 2.7
Intéressons-nous au script suivant :
chaine = raw_input('Entrer un nombre : ') nombre = float(chaine) inverse = 1.0/nombre print "L'inverse de",nombre,'est : ',inverse
Ce script vous demande de saisir un nombre, puis il calcule et affiche son inverse.
Quand on rentre un nombre, tout se déroule normalement :
>>> Entrer un nombre : 10 L'inverse de 10.0 est : 0.1 >>>
Mais que se passe-t-il autrement ?
>>> Entrer un nombre : bonjour Traceback (most recent call last): File "inverse.py", line 2, in <module> nombre = float(chaine) ValueError: could not convert string to float: bonjour >>>
>>> Entrer un nombre : 0 Traceback (most recent call last): File "inverse.py", line 3, in <module> inverse = 1.0/nombre ZeroDivisionError: float division by zero >>>
Python a détecté une erreur : une exception est levée.
Ici nous avons une exception de type ZeroDivisionError
(division par 0) et une exception de type ValueError
.
Une exception arrête l'exécution normale d'un programme.
Heureusement, il est possible de gérer les exceptions pour éviter l'arrêt brutal du programme.
Par cela, on utilise conjointement les instructions try
, except
et else
:
try: chaine = raw_input('Entrer un nombre : ') nombre = float(chaine) inverse = 1.0/nombre except: #ce bloc est exécuté si une exception est levée dans le bloc try print "Erreur !" else: #on arrive ici si aucune exception n'est levée dans le bloc try print "L'inverse de",nombre,'est : ',inverse
>>> Entrer un nombre : 56 L'inverse de 56.0 est : 0.0178571428571 >>> Entrer un nombre : 0 Erreur ! >>>
On peut distinguer les différents types d'exceptions :
try: chaine = raw_input('Entrer un nombre : ') nombre = float(chaine) inverse = 1.0/nombre except ValueError: #ce bloc est exécuté si une exception de type ValueError est levée dans le bloc try print chaine,"n'est pas un nombre !" except ZeroDivisionError: #ce bloc est exécuté si une exception de type ZeroDivisionError est levée dans le bloc try print "Division par zéro !" else: #on arrive ici si aucune exception n'est levée dans le bloc try print "L'inverse de",nombre,'est : ',inverse
>>> Entrer un nombre : 0 Division par zéro ! >>> Entrer un nombre : bonjour bonjour n'est pas un nombre ! >>>
N'oubliez pas : un programme bien écrit doit gérer proprement les exceptions.
Exercice 5.1 Compléter le script précédent de manière à ressaisir le nombre en cas d'erreur.
Par exemple :
>>> Entrer un nombre : salut ! salut ! n'est pas un nombre ! Entrer un nombre : 2,3 2,3 n'est pas un nombre ! Entrer un nombre : 2.3 L'inverse de 2.3 est : 0.434782608696 >>>
Exercice 5.2 Compléter le script de manière à accepter la virgule comme séparateur décimal.
Par exemple :
>>> Entrer un nombre : 2,3 L'inverse de 2.3 est : 0.434782608696 >>>
Exercice 5.3 Ecrire un script qui calcule la racine carrée d'un nombre, avec gestion des exceptions.
Par exemple :
>>> Entrer un nombre : go go n'est pas un nombre valide ! Entrer un nombre : -5.26 -5.26 n'est pas un nombre valide ! Entrer un nombre : 16 La racine carrée de 16.0 est : 4.0 >>>
Exercice 5.4 Soit le script :
i=0 while True: i+=1 print i
Il s'agit d'une boucle sans fin.
Pour arrêter ce programme, il faut appuyer sur les touches CTRL et C, ce qui lève une exception de type KeyboardInterrupt
:
>>> 1 ... 1216 1217 1218 1219 1220 Traceback (most recent call last): raise KeyboardInterrupt KeyboardInterrupt >>>
Compléter le script pour gérer proprement l'exception.
Exemple :
>>> 1 ... 966 967 968 Fin du programme >>>
Contenu sous licence CC BY-NC-SA 3.0
Fabrice Sincère ; version 1.3.5.29
Modifié et adapté par Pascal Hassenforder 15/12/2013