Se você olhar a documentação para os erros embutidos , verá que a maioria das Exceptionclasses atribui seu primeiro argumento como um messageatributo. Porém, nem todos eles o fazem.
Notavelmente, EnvironmentError(com subclasses IOErrore 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 Exceptionpodem fazer o que quiserem. Eles podem ou não ter um messageatributo. Os futuros Exceptions integrados podem não ter um messageatributo. Qualquer Exceptionsubclasse importada de bibliotecas de terceiros ou código de usuário pode não ter um messageatributo.
Acho que a maneira adequada de lidar com isso é identificar as Exceptionsubclasses 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 printalguma coisa, acho que imprimir a captura em Exceptionsi provavelmente fará o que você quiser, tenha messageou 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 ummessageatributo ou não é separado.