Se você olhar a documentação para os erros embutidos , verá que a maioria das Exception
classes atribui seu primeiro argumento como um message
atributo. Porém, nem todos eles o fazem.
Notavelmente, EnvironmentError
(com subclasses IOError
e OSError
) tem um primeiro argumento de errno
, segundo de strerror
. Não há message
... strerror
é aproximadamente análogo ao que normalmente seria um message
.
De maneira mais geral, as subclasses de Exception
podem fazer o que quiserem. Eles podem ou não ter um message
atributo. Os futuros Exception
s integrados podem não ter um message
atributo. Qualquer Exception
subclasse importada de bibliotecas de terceiros ou código de usuário pode não ter um message
atributo.
Acho que a maneira adequada de lidar com isso é identificar as Exception
subclasses específicas que você deseja capturar e, em seguida, capturar apenas aquelas em vez de tudo com um e except Exception
, em seguida, utilizar quaisquer atributos que essa subclasse específica defina como você quiser.
Se você precisar de print
alguma coisa, acho que imprimir a captura em Exception
si provavelmente fará o que você quiser, tenha message
ou não um atributo.
Você também pode verificar o atributo de mensagem se quiser, assim, mas eu não iria sugerir isso, pois parece confuso:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:
é o mesmo queexcept Foo, bar:
(exceto que a primeira é mais recente e continuará a funcionar na 3.x), independentemente de o erro vir com ummessage
atributo ou não é separado.