Définition d'une exception sans paramètre:
class MyException(Exception):
pass
Lorsqu'il est soulevé, y a-t-il une différence entre:
raise MyException
et
raise MyException()
Je n'ai pas pu en trouver; est-ce simplement une syntaxe surchargée?
Réponses:
La réponse courte est que les deux
raise MyException
etraise MyException()
faire la même chose. Ce premier formulaire instancie automatiquement votre exception.La section appropriée de la documentation dit: " rise évalue la première expression comme objet d'exception. Il doit s'agir d'une sous-classe ou d'une instance de BaseException. S'il s'agit d'une classe, l'instance d'exception sera obtenue en cas de besoin en instanciant la classe avec pas d'arguments. "
Cela dit, même si la sémantique est la même, la première forme est microscopiquement plus rapide, et la seconde forme est plus flexible (car vous pouvez lui transmettre des arguments si nécessaire).
Le style habituel que la plupart des gens utilisent en Python (c'est-à-dire dans la bibliothèque standard, dans les applications courantes et dans de nombreux livres) est à utiliser
raise MyException
lorsqu'il n'y a pas d'arguments. Les utilisateurs n'instancient l'exception directement que lorsque certains arguments doivent être passés. Par exemple:raise KeyError(badkey)
.la source
Allez regarder les documents pour la
raise
déclaration . Il crée une instance deMyException
.la source
raise
a un peu changé en Python 3. La partie qui concerne cette question est la même (raise ExceptionType
crée toujours une instance du type en appelant son constructeur sans argument).Oui, il y a une différence entre
ValueError
etValueError()
ValueError
est une classe alors queValueError()
crée une instance d'une classe. C'est la raison pour laquelletype(ValueError) is type
ettype(ValueError()) is ValueError
Le seul but de
raise
est de soulever l'exception,Remarque:
raise ValueError # shorthand for 'raise ValueError()'
la source