Les exceptions
Formation
En Semi-présenciel Paris
Avez-vous besoin d'un coach de formation?
Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.
Description
-
Typologie
Formation
-
Méthodologie
En semi-présentiel
-
Lieu
Paris
Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.
Les sites et dates disponibles
Lieu
Date de début
Date de début
Les Avis
Le programme
Si vous codez en Python, vous avez sûrement déjà été confronté(e) à des erreurs diverses, provenant de l'utilisateur, d'une bibliothèque, etc.
Par exemple, vous souhaitez que l'utilisateur entre un nombre et que votre programme affiche le triple de ce nombre.
Si vous utilisez input() , mais que l'utilisateur entre une chaîne de caractères (sans l'entourer de guillemets), le programme plante lamentablement.
Si vous utilisez raw_input() , vous n'avez pas de problème lors de la saisie, mais vous vous retrouvez avec une chaîne. Or, vous avez besoin d'un nombre.
Si vous utilisez int() pour transformer la chaîne obtenue en nombre, le programme plantera aussi dans le cas où l'utilisateur n'a pas entré un nombre.
Alors, comment remédier à un tel problème ?
Ce tutoriel va vous expliquer comment gérer les erreurs en Python.
Une première partie vous enseignera comment utiliser les mots-clé try , except , finally et else , tandis que la seconde vous présentera une liste des exceptions et des exemples les expliquant. Enfin, la troisième vous expliquera comment créer vos propres exceptions.
Quatre mots-clés vont servir à gérer les erreurs.
try permet « d'essayer » un bout de code. Si une erreur est rencontrée, on cesse d'interpréter le code et on passe aux except , qui permettent d'agir en fonction de l'erreur qui s'est produite. C'est pourquoi try doit toujours être suivi d'au moins un except ou d'un finally .
Nous allons, pour comprendre leur fonctionnement, analyser le code suivant.
Les deux premières lignes, dans le try: , sont tout d'abord interprétées. La première tente d'ouvrir un fichier appelé foo.txt. Si ce fichier existe dans le répertoire du script, remplacez "foo.txt" par autre chose, de sorte que le fichier que le script tente d'ouvrir n'existe pas.
La seconde essaie d'afficher à l'écran la chaîne "abc" convertie en nombre.
La troisième ligne, qui contient le mot-clé except , est exécutée en cas d'IOError . IOError est l'exception lancée lorsqu'il s'avère impossible d'ouvrir un fichier (entre autres). Dans ce cas, on affiche une erreur. La cinquième ligne agit comme la troisième, en cas de ValueError , qui est lancé quand on passe un argument avec le bon type (ici, "abc" est bien une chaîne), mais que la valeur n'est pas correcte ("abc" ne saurait être transformée en nombre, vous en conviendrez).
Lorsque nous lançons ce code, comme foo.txt n'existe pas, l'ouverture du fichier provoque une IOError . Si nous le créons (touch foo.txt sous UNIX), alors la ligne print int("abc") sera interprétée et lancera une ValueError . Si, enfin, nous remplaçons "abc" par "22" (ou toute autre chaîne qui peut être convertie en nombre), alors aucune exception ne sera lancée et seul le bloc try: aura été exécuté.
On peut également mettre un tuple d'exceptions, pour les cas où le même code doit être interprété pour des erreurs différentes :
except (IOError, ValueError):Il est possible de créer une instance de l'exception, afin d'avoir plus d'informations sur une erreur :
try: fichier = open('foo.txt') except IOError, e: print e [Errno 2] No such file or directory: 'foo.txt'Il ne faut pas utiliser except: tout seul, car des exceptions comme celles lancées lorsque l'utilisateur tente de quitter risquent d'être interceptées, et donc d'empêcher celui-ci d'y parvenir. Si vous voulez intercepter toutes les exceptions possibles, utilisez Exception .
Le mot-clé else permet d'interpréter du code lorsqu'aucune exception n'a été lancée dans le try: . Ainsi, on pourrait rajouter une lecture du fichier dans le code précédent :
try: fichier = open("foo.txt", "r") print int("22") except IOError: print "Erreur lors de l'ouverture du fichier !" except ValueError: print "Erreur lors de la conversion !" else: print fichier.read()Ainsi, si le fichier s'est ouvert sans problème, et le reste du code (ici symbolisé par le int("22") ) aussi, le fichier sera lu.
else est néanmoins peu utilisé, car il est bien plus pratique de mettre le code dans le try , comme ceci :
try: fichier = open("foo.txt", "r") print int("22") print fichier.read() except IOError: print "Erreur lors de l'ouerture du fichier !" except ValueError: print 'Erreur lors de la conversion !"Enfin, le mot-clé finally permet d'exécuter du code après l'ensemble try: except: , quoi qu'il arrive (qu'une exception ait été lancée ou non, qu'un return ou un break soit rencontré, le bloc finally: sera interprété).
Liste des exceptions built-inCette partie propose une liste des exceptions built-in en Python, accompagnées pour la plupart d'un exemple.
Certaines exceptions en contiennent d'autres : par exemple, Exception regroupe toutes les exceptions, exceptés KeyboardInterrupt , SystemExit , et bien sûr, BaseException , qui regroupe l'ensemble des exceptions. La hiérarchie est la suivante :
BaseException
SystemExit
KeyboardInterrupt
Exception
GeneratorExit
StopIteration
StandardError
ArithmeticError
FloatingPointError
OverflowError
ZeroDivisionError
AssertionError
AttributeError
EnvironmentError
IOError
OSError
VMSError
EOFError
ImportError
LookupError
IndexError
KeyError
MemoryError
NameError
UnboundLocalError
ReferenceError
RuntimeError
NotImplementedError
SyntaxError
IndentationError
TabError
SystemError
TypeError
ValueError
UnicodeError
UnicodeDecodeError
UnicodeEncodeError
UnicodeTranslateError
Warning
DeprecationWarning
PendingDeprecationWarning
RuntimeWarning
SyntaxWarning
UserWarning
FutureWarning
ImportWarning
UnicodeWarning
BaseException regroupe l'ensemble des exceptions built-in. Les exceptions définies par l'utilisateur (comme nous allons apprendre à le faire) ne doivent pas en hériter directement, mais hériter d'Exception .
SystemExit est l'exception lancée par sys.exit() . Si elle n'est pas interceptée par un except: , le programme s'arrête. Elle n'hérite pas d'Exception pour que, lorsque le développeur cherche à intercepter toutes les erreurs possibles, il n'empêche pas le programme de quitter.
KeyboardInterrupt est lancé lorsque l'utilisateur appuie sur les touches d'interruption (généralement Ctrl + C). Tout comme SystemExit, il hérite directement de BaseException , pour les mêmes raisons.
Exception regroupe toutes les exceptions qui ne se rapportent pas à la fermeture du programme. Vos propres exceptions doivent en dériver. On l'utilise généralement pour s'assurer que tout a bien fonctionné, et dans le cas contraire, pour intercepter puis afficher l'erreur qui s'est produite :
try: # code except Exception, e: print "Erreur : %s", % eGeneratorExit est lancé lorsqu'on utilise la méthode close() d'un générateur. Pour en savoir plus sur les générateurs, je vous conseille le tutoriel de Natim sur les pratiques avancées et méconnues en Python, qui fournit notamment un exemple d'utilisation de cette exception.
StopIteration est, lui aussi, lié aux générateurs. Le tutoriel précédemment cité en parle également.
StandardError regroupe toutes les exceptions, sauf les Warnings, GeneratorExit et StopIteration puisqu'il ne s'agit pas d'erreurs à proprement parler.
ArithmeticError est la classe de base pour les erreurs d'arithmétique.
FloatingPointError est lancé lorsqu'une erreur est détectée dans une opération à virgule flottante.
OverflowError est lancé lorsque le résultat d'une opération est trop grand pour être représenté.
ZeroDivisionError est l'exception lancée lorsque le programme tente de faire une division (ou un modulo) par zéro.
try: print 5/0 except ZeroDivisionError, e: print e try: print 5%0 except ZeroDivisionError, e: print e integer division or modulo by zero integer division or modulo by zeroAssertionError est lancé lorsqu'un assert n'est pas vrai.
try: assert 1 == 0 except AssertionError: print "Erreur !" Erreur !AttributeError est lancé lorsqu'une erreur se produit lors d'une référence ou d'un assignement à un attribut.
class Foo: pass foo = Foo() try: print foo.bar except AttributeError, e: print e Foo instance has no attribute 'bar'EnvironmentError est la classe de base des exceptions qui ne proviennent pas de Python (par exemple, un fichier introuvable).
IOError est une exception lancée lorsqu'une erreur I/O (pour Input/Output) se produit. Trois attributs sont intéressants : errno , qui indique le numéro de l'erreur ; filename , qui donne le nom du fichier concerné ; et strerror qui donne une description de l'erreur.
try: fichier = open("foo.txt", "r") except...
Avez-vous besoin d'un coach de formation?
Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.
Les exceptions