Python の標準ライブラリのコンポーネントから例外のメッセージを取得する最良の方法は何ですか?
場合によっては、次のようなフィールド経由で取得できることに気付きましたmessage
。
try:
pass
except Exception as ex:
print(ex.message)
ただし、場合によっては (たとえば、ソケット エラーの場合)、次のようにする必要があります。
try:
pass
except socket.error as ex:
print(ex)
こうした状況のほとんどをカバーする標準的な方法はあるのだろうか?
ベストアンサー1
を見てみると組み込みエラーのドキュメント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:
# Just print(e) is cleaner and more likely what you want,
# but if you insist on printing message specifically whenever possible...
if hasattr(e, 'message'):
print(e.message)
else:
print(e)