Les exceptions python

Posté le 03/07/2007 sous python

Les exceptions python sont toutes simple. Vous pouvez facilement créer les votre:

>>> class MonException(Exception):
...     """ Une exception """

Puis les propager:

>>> raise MonException('Bouh !')
Traceback (most recent call last):
...
MonException: Bouh !

Ca, c'est la base. Mais il y a des trucs plus rigolo à faire. Par exemple garder la trace d'une suite d'exceptions:

>>> class MultiException(Exception):
...     """ une exception contstitué de plusieurs autre """
...     def __init__(self):
...         Exception.__init__(self)
...         self.data = []
...     def __nonzero__(self):
...         return self.data and True or False
...     def __str__(self):
...         return ', '.join(['%s: %s' % (e.__class__.__name__,str(e)) for e in self.data])

Et voila ce que cela donne à l'utilisation. On fait une boucle dans laquelle une ou plusieurs exceptions peuvent se produire:

>>> exceptions = MultiException()
>>> for i in [1, 3, 0, 7, 1, 0]:
...     try:
...       a = 2/i
...     except Exception, e:
...       exceptions.data.append(e)

Puis on propage notre exception si elle n'est pas vide:

>>> if exceptions:
...     raise exceptions
Traceback (most recent call last):
...
MultiException: ZeroDivisionError: integer division or modulo by zero, ZeroDivisionError: integer division or modulo by zero

On voit bien ainsi que deux exceptions se sont produites et non une seule. On pourrait faire mieux. Par exemple conserver la pile de chaque exception, etc.

En fait, je n'ai rien inventé. C'est le principe utilisé par exemple dans Zope pour gérer la validation de formulaire (zope.app.form). Je trouve que c'est plutôt un bon concept. Après tout, une erreur de saisie c'est quelque chose qui engendre une erreur. Donc une exception :)