組み込みエラーのドキュメントを見ると、ほとんどの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
です。