1. ホーム
  2. python

[解決済み] Pythonで例外メッセージを正しく取得する方法

2022-05-17 14:09:23

質問

Pythonの標準ライブラリのコンポーネントから例外のメッセージを取得する最も良い方法は何でしょうか?

私は、いくつかのケースでは、あなたがそれを得ることができることに気づいた message のフィールドにこのように記述します。

try:
  pass
except Exception as ex:
  print(ex.message)

のように記述しますが、場合によっては(例えば、ソケットエラーの場合)このように記述する必要があります。

try:
  pass
except socket.error as ex:
  print(ex)

これらの状況のほとんどをカバーする標準的な方法はないのでしょうか?

どのように解決するのですか?

もし、あなたが のドキュメントを見ると、組み込みエラーの のドキュメントを見ると、ほとんどの Exception クラスはその最初の引数を message 属性として割り当てます。しかし、それらすべてがそうするわけではありません。

注目すべきは EnvironmentError (サブクラス IOErrorOSError ) は、第一引数が errno であり、第二引数は strerror . はありません。 message ... strerror は、通常であればおおよそ message .

より一般的には Exception のサブクラスは好きなようにできます。それらは message 属性があってもなくてもかまいません。将来の組み込み Exception には message 属性を持つことはできません。どんな Exception サブクラスは、サードパーティライブラリやユーザコードからインポートされたものには message 属性がない場合があります。

私は、この処理の適切な方法は、特定の Exception サブクラスを特定し、そのサブクラスだけを捕捉することです。 except Exception を持つすべてのサブクラスをキャッチするのではなく、それらのサブクラスのみをキャッチし、その特定のサブクラスが定義する任意の属性を好きなように利用します。

もし、どうしても print を表示させることは、非常に効果的だと思います。 Exception があるかどうかに関わらず、それ自体を表示することが最も可能性が高いと思います。 message 属性があろうとなかろうと。

必要であれば、このように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)