回答:
import traceback
traceback.print_exc()
except ...:
ブロック内でこれを行うと、現在の例外が自動的に使用されます。詳細については、http://docs.python.org/library/traceback.htmlを参照してください。
もありlogging.exception
ます。
import logging
...
try:
g()
except Exception as ex:
logging.exception("Something awful happened!")
# will print this message followed by traceback
出力:
ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened!
Traceback (most recent call last):
File "b.py", line 22, in f
g()
File "b.py", line 14, in g
1/0
ZeroDivisionError: integer division or modulo by zero
(http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/より、トレースバックなしで完全なトレースバックを印刷する方法プログラムを停止しますか?)
traceback.print_exc()
ですか?
Pythonで同等のe.printStackTrace
Javaでは、これは次のことを行います(docs):
public void printStackTrace()
このスロー可能オブジェクトとそのバックトレースを標準エラーストリームに出力します...
これは次のように使用されます:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
Javaでは、標準エラーストリームはバッファリングされないため、出力はすぐに到着します。
import traceback
import sys
try: # code that may raise an error
pass
except IOError as e: # exception handling
# in Python 2, stderr is also unbuffered
print >> sys.stderr, traceback.format_exc()
# in Python 2, you can also from __future__ import print_function
print(traceback.format_exc(), file=sys.stderr)
# or as the top answer here demonstrates, use:
traceback.print_exc()
# which also uses stderr.
Python 3では、例外オブジェクトから直接トレースバックを取得できます(スレッド化されたコードの方が動作が優れている可能性があります)。また、stderrは行バッファリングされますが、print関数はフラッシュ引数を取得するため、これは直ちにstderrに出力されます。
print(traceback.format_exception(None, # <- type(e) by docs, but ignored
e, e.__traceback__),
file=sys.stderr, flush=True)
結論:
したがって、Python 3では、はデフォルトtraceback.print_exc()
でを使用sys.stderr
しますが、出力をバッファーに入れ、失われる可能性があります。したがって、可能な限り同等のセマンティクスを取得するには、Python 3ではprint
withを使用しflush=True
ます。
他の偉大な答えに加えて、我々は、Pythonに使用できるlogging
ライブラリのdebug()
、info()
、warning()
、error()
、およびcritical()
方法を。以下のためのドキュメントからの引用のPython 3.7.4、
検査されるkwargsには3つのキーワード引数があります。exc_infoは、falseと評価されない場合に、例外情報をロギングメッセージに追加します。
つまり、Python logging
ライブラリを使用してdebug()
、またはその他のタイプのメッセージを出力でき、logging
ライブラリはその出力にスタックトレースを含めます。これを念頭に置いて、次のことを実行できます。
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def f():
a = { 'foo': None }
# the following line will raise KeyError
b = a['bar']
def g():
f()
try:
g()
except Exception as e:
logger.error(str(e), exc_info=True)
そしてそれは出力します:
'bar'
Traceback (most recent call last):
File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
g()
File "<ipython-input-2-8ae09e08766b>", line 14, in g
f()
File "<ipython-input-2-8ae09e08766b>", line 10, in f
b = a['bar']
KeyError: 'bar'
format_exc
代わりに文字列を取得できます。