Si observa la documentación de los errores incorporados , verá que la mayoría de las Exceptionclases asignan su primer argumento como messageatributo. Sin embargo, no todos lo hacen.
En particular, EnvironmentError(con subclases IOErrory OSError) tiene un primer argumento de errno, segundo de strerror. No hay message... strerrores aproximadamente análogo a lo que normalmente sería un message.
De manera más general, las subclases de Exceptionpueden hacer lo que quieran. Pueden tener o no un messageatributo. Es posible que los mensajes de correo electrónico integrados futuros Exceptionno tengan un messageatributo. Es posible que cualquier Exceptionsubclase importada de bibliotecas de terceros o código de usuario no tenga un messageatributo.
Creo que la forma correcta de manejar esto es identificar las Exceptionsubclases 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 printalgo, creo que Exceptiones más probable que la impresión de la captura en sí haga lo que desee, tenga messageo 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 unmessageatributo o no sea separado.