Quelle est la bonne façon de déclarer des classes d'exceptions personnalisées dans le langage Python moderne ? Mon objectif principal est de suivre le standard des autres classes d'exception, de sorte que (par exemple) toute chaîne supplémentaire que j'inclus dans l'exception soit imprimée par l'outil qui a détecté l'exception.
Par "Python moderne", j'entends quelque chose qui fonctionnera dans Python 2.5 mais qui sera "correct" pour la façon de faire de Python 2.6 et Python 3.*. Et par "personnalisé", j'entends un objet Exception qui peut inclure des données supplémentaires sur la cause de l'erreur : une chaîne de caractères, peut-être aussi un autre objet arbitraire pertinent pour l'exception.
J'ai été surpris par l'avertissement de dépréciation suivant dans Python 2.6.2 :
>>> class MyError(Exception):
... def __init__(self, message):
... self.message = message
...
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
Il semble fou que BaseException
a une signification particulière pour les attributs nommés message
. J'en déduis que PEP-352 cet attribut avait une signification particulière dans la version 2.5 qu'ils essaient de déprécier, donc je suppose que ce nom (et lui seul) est maintenant interdit ? Ugh.
Je suis aussi vaguement conscient que Exception
a un paramètre magique args
mais je n'ai jamais su comment l'utiliser. Je ne suis pas non plus sûr que ce soit la bonne façon de faire les choses à l'avenir ; une grande partie des discussions que j'ai trouvées en ligne suggéraient qu'ils essayaient de se débarrasser des args dans Python 3.
Mise à jour : deux réponses ont suggéré de remplacer __init__
y __str__
/ __unicode__
/ __repr__
. Cela semble être une longue saisie, est-ce nécessaire ?
23 votes
Je crois que c'est l'un de ces cas où Python ne suit pas l'un de ses propres aphorismes :
There should be one-- and preferably only one --obvious way to do it.