Pythonで例外メッセージを適切に取得する方法 質問する

Pythonで例外メッセージを適切に取得する方法 質問する

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がない可能性がありますmessageExceptionサードパーティのライブラリまたはユーザー コードからインポートされたサブクラスには、属性がない可能性がありますmessage

これを処理する適切な方法は、Exceptionキャッチする特定のサブクラスを識別し、 ですべてをキャッチするのではなくそれらのサブクラスだけをキャッチしexcept Exception、その特定のサブクラスが定義する属性を必要に応じて利用することだと思います。

何かしなければならない場合は、属性があるかどうかに関係なく、キャッチされたもの自体を印刷すると、目的の動作を実行できる可能性が最も高いとprint思います。Exceptionmessage

必要に応じて、次のようにメッセージ属性を確認することもできますが、見た目が乱雑になるのであまりお勧めしません。

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)

おすすめ記事