Outils personnels
Vous êtes ici : Accueil Python Quoi de neuf dans Python 2.5 PEP 352: Les exceptions deviennent des classes "new-style"

PEP 352: Les exceptions deviennent des classes "new-style"

Par Benjamin Poulain - Dernière modification 18/04/2008 21:03
Contributeurs : Bozo_le_clown
Python License

A partir de Python 2.5, la hiérarchie des classes d'exception à changé et les exceptions devraient être des classes héritant de BaseException. La nouvelle hiérarchie introduit la classe Exception permettant de gérer toutes les erreurs standards du programme.

Les classes des exceptions peuvent maintenant être des classes new-style, et non plus juste des classes classiques, et la classe Exception intégrée au langage ainsi que toutes les exceptions standard (NameError, ValueError, etc) sont maintenant des classes new-style.

La hiérarchie d'héritage pour les exceptions a été retravaillée un peu. Avec Python 2.5, les relations d'héritage sont:

BaseException   # Introduit avec Python 2.5
|-KeyboardInterrupt
|-SystemExit
|-Exception
|- (toutes les autres exceptions courantes)

Ce réarrangement a été fait car les développeurs voulaient souvent gérer toutes les exceptions qui indiquaient une erreur du programme. KeyboardInterrupt et SystemExit ne sont pas des erreurs, et représentent souvent une action explicite comme l'utilisateur qui clique sur Ctrl-C ou le code qui appelle sys.exit(). Un simple "except:" intercepte alors toutes les exceptions, ce qui oblige à intercepter explicitement KeyboardInterrupt et SystemExit pour les lever à nouveau. Le schéma habituel est le suivant :

try:
...
except (KeyboardInterrupt, SystemExit):
raise
except:
# Loguer l'erreur...
# Continuer le programme...

Avec Python 2.5, vous pouvez maintenant écrire simplement "except Exception" pour avoir le même résultat, cela intercepte toutes les exceptions qui indiquent habituellement des erreurs mais laisse les KeyboardInterupts et SystemExit non gérés. Comme dans les versions précédentes, "except:" intercepte toujours toutes les exceptions.

Le but pour Python 3.0 est que toutes les instances levées comme une exception aient une classe dérivée de BaseException ou d'un descendant de BaseException, et les futures versions de Python 2.x commenceront à imposer cette contrainte. Par conséquent, je vous suggère dès à présent de commencer à faire hériter de Exception toutes vos classes d'exception. Il a été suggéré que que le "except:" vide serait supprimé dans Python 3.0, mais Guido van Rossum n'a pas encore décidé si cela serait fait ou non.

Lever une chaîne de caractères comme exception, comme dans l'opération "raise 'Une erreur est apparue'", est dépréciée dans Python 2.5 et affichera un avertissement. Le but est de pouvoir retirer la fonctionnalité de string-exception dans une prochaine version.

Actions sur le document