[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
質問
終了せずに例外をキャッチしてログに残したいのですが、例えば。
try:
do_stuff()
except Exception as err:
print(Exception, err)
# I want to print the entire traceback here,
# not just the exception name and details
例外が発生したときに出力されるのとまったく同じ出力を、例外をインターセプトするtry...以外では出力したいのですが、どうすればいいでしょうか? ない 私のプログラムを終了させたいのです。 どうしたらいいでしょうか?
解決方法は?
他の回答で既に指摘されている トレースバック モジュールを使用します。
を使用していることに注意してください。
print_exc
このような場合、期待するような結果が得られないことがあります。Python 2.xの場合。
import traceback
try:
raise TypeError("Oups!")
except Exception, err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_exc()
...のトレースバックを表示します。 最後の 例外が発生します。
Traceback (most recent call last):
File "e.py", line 7, in <module>
raise TypeError("Again !?!")
TypeError: Again !?!
どうしてもオリジナルの
トレースバック
をキャッシュするのもひとつの方法です。
例外情報
から返されるように
exc_info
をローカル変数に入れ、それを
print_exception
:
import traceback
import sys
try:
raise TypeError("Oups!")
except Exception, err:
try:
exc_info = sys.exc_info()
# do you usefull stuff here
# (potentially raising an exception)
try:
raise TypeError("Again !?!")
except:
pass
# end of useful stuff
finally:
# Display the *original* exception
traceback.print_exception(*exc_info)
del exc_info
プロデュースすること。
Traceback (most recent call last):
File "t.py", line 6, in <module>
raise TypeError("Oups!")
TypeError: Oups!
しかし、これにはいくつかの落とし穴があります。
-
のドキュメントから
sys_info
:例外を処理している関数内でトレースバックの戻り値をローカル変数に代入すると 循環参照 . このため、同じ関数内のローカル変数やトレースバックから参照されたものは、ガベージコレクションされなくなります。[...] トレースバックが必要な場合は、使用後に必ず削除してください。 (try...finallyステートメントで行うのがベスト)
-
が、同じdocから。
Python 2.2 以降、このようなサイクルは自動的に再生されます。 しかし、サイクルを作成しない方がより効率的であることに変わりはありません。
一方、トレースバックにアクセスできるようにすることで に関連する は、あまり驚かない結果をもたらします。
import traceback
try:
raise TypeError("Oups!")
except Exception as err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_tb(err.__traceback__)
...が表示されます。
File "e3.py", line 4, in <module>
raise TypeError("Oups!")
関連
-
pythonを使ったオフィス自動化コード例
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] 改行やスペースを入れずに印刷する方法
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] フルパスでモジュールをインポートするには?
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
-
[解決済み】トレースバックなしでPythonを終了する方法は?
-
[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
最新
-
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の@decoratorsについてまとめてみました。
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] データ型が理解できない
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み】例外の説明と例外を発生させたスタックトレースを文字列で取得する。
-
[解決済み】pythonのe.printStackTraceの等価性
-
[解決済み] Pythonで、変数がNone、True、Falseのいずれであるかをどのようにテストすればよいのでしょうか?