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 ブロックをステートメントで終了すると、キャッチされた例外が透過的に再発生し、問題が解決されます。message
raise
上記とexcept:
引数なしの just の使用との違いは 2 つあります。
- bareは
except:
検査する例外オブジェクトを提供しない - 例外
SystemExit
、KeyboardInterrupt
およびはGeneratorExit
上記のコードでは捕捉されませんが、これは通常望ましい動作です。例外階層。
例外をキャッチしない場合に取得するのと同じスタック トレースが必要な場合は、次のようにして取得できます (引き続き except 句内)。
import traceback
print traceback.format_exc()
を使用する場合logging
モジュールでは、次のように例外を(メッセージとともに)ログに出力できます。
import logging
log = logging.getLogger()
log.exception("Message for you, sir!")
スタックを詳しく調べて変数などを確認したい場合は、post_mortem
pdb
except ブロック内のモジュールの機能:
import pdb
pdb.post_mortem()
この最後の方法は、バグを追跡するときに非常に役立つことがわかりました。