Definición de una excepción sin parámetros:
class MyException(Exception):
pass
Cuando se eleva, ¿hay alguna diferencia entre:
raise MyException
y
raise MyException()
No pude encontrar ninguno; ¿Es simplemente una sintaxis sobrecargada?
Respuestas:
La respuesta corta es que tanto
raise MyException
yraise MyException()
hacen lo mismo. Este primer formulario crea automáticamente una instancia de su excepción.La sección relevante de los documentos dice: " raise evalúa la primera expresión como el objeto de excepción. Debe ser una subclase o una instancia de BaseException. Si es una clase, la instancia de excepción se obtendrá cuando sea necesario instanciando la clase con sin argumentos."
Dicho esto, aunque la semántica es la misma, la primera forma es microscópicamente más rápida y la segunda forma es más flexible (porque puede pasarle argumentos si es necesario).
El estilo habitual que la mayoría de la gente usa en Python (es decir, en la biblioteca estándar, en aplicaciones populares y en muchos libros) es usarlo
raise MyException
cuando no hay argumentos. Las personas solo crean instancias de la excepción directamente cuando es necesario pasar algunos argumentos. Por ejemplo:raise KeyError(badkey)
.fuente
Ve a la documentación para ver la
raise
declaración . Está creando una instancia deMyException
.fuente
raise
ha cambiado un poco en Python 3. Sin embargo, la parte que es relevante para esta pregunta es la misma (raise ExceptionType
aún crea una instancia del tipo llamando a su constructor sin argumentos).Sí, hay una diferencia entre
ValueError
yValueError()
ValueError
es una clase mientras queValueError()
crea una instancia de una clase. Esta es la razón por la quetype(ValueError) is type
ytype(ValueError()) is ValueError
El único propósito de
raise
es plantear la excepción,Nota:
raise ValueError # shorthand for 'raise ValueError()'
fuente