2010-07-12 5 views
10

Me gustaría saber cuál es la mejor práctica para generar una excepción sin argumentos. En la documentación oficial de Python, se puede ver esto:Python, rasing una excepción sin argumentos

try: 
    raise KeyboardInterrupt 

(. http://docs.python.org/tutorial/errors.html cap 8.6)

y en algún código differents, como Django o el código de Google, se puede ver esto:

def AuthenticateAndRun(self, username, password, args): 
    raise NotImplementedError() 

(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)

La excepción es instanciate antes de ser levantada mientras no hay ningún argumento. ¿Cuál es el propósito de instanciar una excepción sin argumentos? ¿Cuándo debería usar el primer caso o el segundo caso?

Gracias de antemano Fabien

Respuesta

3

levantando una clase de excepción en lugar de una instancia de excepción está en desuso sintaxis y no se deben utilizar en el nuevo código.

raise Exception, "This is not how to raise an exception..." 
+0

Para los curiosos, ver http://www.python.org/dev/peps/pep-0352/#transition-plan para obtener más información acerca de la desactivación relacionada con la excepción. –

+8

No soy capaz de descubrir lo que estás recomendando. Su ejemplo de código parece ser qué ** no ** hacer. Tal vez deberías mostrar lo que * debería * hacerse. –

+0

Aún no estoy seguro de qué se debe hacer tampoco. – FrenchKheldar

0

En idiomas como C++, puede levantar cualquier objeto, no solo Excepciones. Python es más limitado. Si intenta:

raise 1 

Se obtiene:

Traceback (most recent call last): 
... 
TypeError: exceptions must be old-style classes or derived from BaseException, not int 

En el modelo de programación Python que por lo general puede usar una clase por sí mismo en lugar de una instancia (esto es muy útil para la creación rápida de instancias únicas, simplemente definir una clase). Por lo tanto, no es de extrañar que pueda generar una clase de excepción en lugar de una instancia de excepción.

Sin embargo, como dijo Ignacio, eso está en desuso.

Además, algunos nota lateral que no es la pregunta directa:

Usted también podría ver a recaudar por sí solos en algún código. Sin ninguna clase de objeto ni nada. Se usa en controladores de excepciones para volver a generar la excepción actual y mantendrá el rastreo inicial.

3

Puede usar la forma que desee. No existe una diferencia real y ambos son legales en Python 2 y 3. Python style guide no especifica cuál es el recomendado.


Un poco más de información sobre el apoyo "forma de clase":

try: 
    raise KeyboardInterrupt 

Esta forma es perfectamente legal, tanto en Python 2 y 3. Extracto de pep-3109:

aumento EXCEPTION se usa para generar una nueva excepción. Este formulario tiene dos subvariantes : EXCEPTION puede ser una clase de excepción o una instancia de una clase de excepción ; las clases de excepción válidas son BaseException y sus subclases [5].Si EXCEPTION es una subclase, se invocará sin argumentos para obtener una instancia de excepción.

También se describe en Python documentation:

... Si se trata de una clase, se obtendrá la instancia de excepción cuando sea necesario creando una instancia de la clase sin argumentos.

Cuestiones relacionadas