組み込みエラーのドキュメントを見ると、ほとんどのExceptionクラスが最初の引数をmessage属性として割り当てていることがわかります。しかし、それらすべてがそうするわけではありません。
特に、EnvironmentError(サブクラスIOErrorとOSError)の最初の引数はerrno、の2番目ですstrerror。ありませんmessage...strerror通常のように大まかに類似していmessageます。
より一般的には、のサブクラスExceptionは好きなことを行うことができます。それらにはmessage属性がある場合とない場合があります。将来の組み込みExceptionはmessage属性を持たない可能性があります。任意のExceptionサードパーティ製のライブラリまたはユーザーコードからインポートサブクラスは持っていない可能性がありmessage、属性を。
これを処理する適切な方法はException、キャッチしたい特定のサブクラスを識別し、すべてではなくそれらだけをキャッチし、except Exception特定のサブクラスが定義する属性を任意に利用することだと思います。
あなたがprint何かをしなければならないなら、私Exceptionはそれがmessage属性を持っているかどうかにかかわらず、捕らえられたもの自体を印刷することはあなたが望むことをする可能性が最も高いと思います。
このように、必要に応じてメッセージ属性を確認することもできますが、面倒に見えるため、実際にはお勧めしません。
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:が、except Foo, bar:(前者がより新しく、3.xで引き続き機能することを除いて)同じmessageです。