Gestion des erreurs avec try et except
Ce script permet de faire deviner à l’utilisateur un nombre compris entre 1 et 10 que le programme aura choisi grâce à randint ( ) importé du module intégré random.
from random import randint nbreAdeviner = randint (1, 10) reponse = -1 nbreEssais = 0 while reponse < 1 or reponse > 10: reponse = input("Choisissez un nombre de 1 à 10 : ") try: reponse = int(reponse) except ValueError: print("Vous n'avez pas saisi un nombre mais un autre caractère") reponse = -1 continue if reponse < 1 : nbreEssais = nbreEssais + 1 print("Ce nombre est inférieur à 1 !!!") elif reponse > 10 : nbreEssais = nbreEssais + 1 print("Ce nombre est supérieur à 10 !!!") if reponse == nbreAdeviner : nbreEssais = nbreEssais + 1 print ("Le nombre à deviner entre 1 et 10 est bien ", reponse) print ("Vous avez trouvé en ",nbreEssais," essais") elif reponse != nbreAdeviner and 1 <= reponse <= 10 : nbreEssais = nbreEssais + 1 print ("Le nombre à deviner entre 1 et 10 n'est pas ", reponse) reponse = -1 continue
Exécution , si je rentre une donnée autre qu'un nombre. Ensuite, je ne fais plus d'erreur.
>>> Choisissez un nombre de 1 à 10 : f Vous n'avez pas saisi un nombre mais un autre caractère Choisissez un nombre de 1 à 10 : 1 Le nombre à deviner entre 1 et 10 n'est pas 1 Choisissez un nombre de 1 à 10 : 3 Le nombre à deviner entre 1 et 10 est bien 3 Vous avez trouvé en 2 essais
Choisissez un nombre de 1 à 10 : f
Vous n'avez pas saisi un nombre mais un autre caractère
try: Essaie
reponse = int(reponse) convertis reponse en integer
except ValueError: sauf s'il y a une erreur de valeur
print("Vous n'avez pas saisi un nombre mais un autre caractère") écris ...
reponse = -1
continue recommence
Il y a tout un nombre d'erreurs possibles intégrées dans Python, c'est le cas de ValueError. Mais on peut aussi en créer !
Pour bien comprendre :
>>> reponse = input("Choisissez un nombre de 1 à 10 : ") Choisissez un nombre de 1 à 10 : 3 >>> reponse = int(reponse) >>> reponse 3 >>> reponse = input("Choisissez un nombre de 1 à 10 : ") Choisissez un nombre de 1 à 10 : h >>> reponse = int(reponse) Traceback (most recent call last): File "<pyshell#4>", line 1, in reponse = int(reponse) ValueError: invalid literal for int() with base 10: 'h' >>>
Si vous rentrez un nombre via la fonction input (pour rappel, la valeur entrée via input () est par défaut une chaîne de caractères ou string), et que vous faites la conversion en integer via la fonction int ( ), tout se passe bien. Mais si vous entrez une chaîne ou string, ici un "h", vous générez une erreur puisque Python ne peut convertir une chaîne en nombre entier.
C'est pour cela que Python a la possibilité de gérer les erreurs via les mots-clés try et except.
Le code suivant montre toutes les possibilités de la procédure
reponse = input("Choisissez un nombre de 1 à 10 : ") try: reponse = int(reponse) print (reponse) except ValueError: print("Vous n'avez pas saisi un nombre mais un autre caractère") else: print ("hello") finally : print ("coucou")
Exécution :
>>> Choisissez un nombre de 1 à 10 : h Vous n'avez pas saisi un nombre mais un autre caractère coucou >>> ================================ RESTART ================================ >>> Choisissez un nombre de 1 à 10 : 1 1 hello coucou
Le code sous le mot-clé finally s'exécute quoi qu'il arrive et le code sous else s'exécute s'il n'y a pas d'erreur détectée.