どのような種類の例外が発生したかを判断するにはどうすればいいですか? 質問する

どのような種類の例外が発生したかを判断するにはどうすればいいですか? 質問する

some_function()実行中に例外が発生したため、プログラムは にジャンプしますexcept

try:
    some_function()
except:
    print("exception happened!")

例外が発生した原因を確認するにはどうすればよいでしょうか?

ベストアンサー1

他の回答はすべて、一般的な例外をキャッチすべきではないと指摘していますが、なぜそうするのかを誰も教えてくれないようです。これは、「ルール」を破ることができるタイミングを理解するために不可欠です。ここ説明です。基本的には、次のことを隠さないようにするためです。

したがって、これらのいずれにも注意しない限り、一般的な例外をキャッチしても問題ありません。たとえば、次のように別の方法で例外に関する情報をユーザーに提供できます。

  • 例外をGUIのダイアログとして表示する
  • マルチスレッドまたはマルチプロセスアプリケーションで、ワーカースレッドまたはプロセスから制御スレッドまたはプロセスに例外を転送します。

では、一般的な例外をキャッチするにはどうすればよいでしょうか。方法はいくつかあります。例外オブジェクトだけが必要な場合は、次のようにします。

try:
    someFunction()
except Exception as ex:
    template = "An exception of type {0} occurred. Arguments:\n{1!r}"
    message = template.format(type(ex).__name__, ex.args)
    print message

見逃しにくい方法で、ユーザーの注意を引くようにしてください。メッセージが他の多くのメッセージに埋もれている場合は、上記のように印刷するだけでは不十分な場合があります。ユーザーの注意を引かないことは、すべての例外を飲み込むのと同じであり、このページの回答を読んだ後に 1 つだけ印象に残るとすれば、これは良いことではないということです。except ブロックステートメントで終了すると、キャッチされた例外が透過的に再発生し、問題が解決されます。messageraise

上記とexcept:引数なしの just の使用との違いは 2 つあります。

  • bareはexcept:検査する例外オブジェクトを提供しない
  • 例外SystemExitKeyboardInterruptおよびはGeneratorExit上記のコードでは捕捉されませんが、これは通常望ましい動作です。例外階層

例外をキャッチしない場合に取得するのと同じスタック トレースが必要な場合は、次のようにして取得できます (引き続き except 句内)。

import traceback
print traceback.format_exc()

を使用する場合loggingモジュールでは、次のように例外を(メッセージとともに)ログに出力できます。

import logging
log = logging.getLogger()
log.exception("Message for you, sir!")

スタックを詳しく調べて変数などを確認したい場合は、post_mortempdbexcept ブロック内のモジュールの機能:

import pdb
pdb.post_mortem()

この最後の方法は、バグを追跡するときに非常に役立つことがわかりました。

おすすめ記事