Si observa la documentación de los errores incorporados , verá que la mayoría de las Exception
clases asignan su primer argumento como message
atributo. Sin embargo, no todos lo hacen.
En particular, EnvironmentError
(con subclases IOError
y OSError
) tiene un primer argumento de errno
, segundo de strerror
. No hay message
... strerror
es aproximadamente análogo a lo que normalmente sería un message
.
De manera más general, las subclases de Exception
pueden hacer lo que quieran. Pueden tener o no un message
atributo. Es posible que los mensajes de correo electrónico integrados futuros Exception
no tengan un message
atributo. Es posible que cualquier Exception
subclase importada de bibliotecas de terceros o código de usuario no tenga un message
atributo.
Creo que la forma correcta de manejar esto es identificar las Exception
subclases específicas que desea capturar, y luego capturar solo aquellas en lugar de todo con un except Exception
, luego utilizar los atributos que esa subclase específica defina como desee.
Si debe print
algo, creo que Exception
es más probable que la impresión de la captura en sí haga lo que desee, tenga message
o no un atributo.
También puede verificar el atributo de mensaje si lo desea, así, pero realmente no lo sugeriría ya que parece desordenado:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:
es lo mismo queexcept Foo, bar:
(excepto que el primero es más nuevo y continuará funcionando en 3.x), ya sea que el error venga con unmessage
atributo o no sea separado.