[解決済み】python: どのような例外が発生したかを知るにはどうすればよいですか?
質問
メインプログラムから呼び出される関数があります。
try:
someFunction()
except:
print "exception happened!"
が、関数実行の途中で例外が発生し、そのため
except
の部分があります。
で何が起こったかを正確に知るにはどうすればよいのでしょうか?
someFunction()
例外を発生させる原因となったのは?
解決方法は?
他の回答はすべて、一般的な例外をキャッチすべきではないことを指摘していますが、誰もその理由を言いたがっていないようです。 これ がその説明です。基本的には、隠れないようにするためです。
- エラーが発生したこと
- 発生したエラーの具体的な内容 ( エラー隠蔽のアンチパターン )
つまり、これらのことをしないように気をつければ、汎用例外をキャッチしても問題ないわけです。例えば、例外に関する情報を別の方法でユーザーに提供することもできます、以下のように。
- 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
作る
確実
message
は、見逃しにくい方法でユーザーの注意を喚起します! 上記のように印刷しても、メッセージが他の多くのメッセージに埋もれてしまっては、十分とは言えません。ユーザーの注意を引かないということは、すべての例外を飲み込んでしまうことと同じです。このページの回答を読んで、あなたが抱くべき印象があるとすれば、それは、これは
良いことではない
. exceptブロックの最後を
raise
文は、捕捉した例外を透過的に再発生させることで問題を解決します。
上記と、単に
except:
引数なしは2つあります。
-
裸の
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()
この方法は、バグを発見するのに非常に有効な方法です。
関連
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み] 文字列が数値(float)であるかどうかを確認するにはどうすればよいですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み] 例外を正しく無視する方法