Pythonで同等のe.printStackTrace


208

print(e)(eは例外です)発生した例外を出力することは知っていますが、Javaに相当するpythonでe.printStackTrace()、例外を発生した行まで正確に追跡し、そのトレース全体を出力するpythonを見つけようとしていました。

誰かe.printStackTrace()がPython の同等のものを教えてくれませんか?

回答:



116

もあり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()ですか?
ネイサン

18

Pythonで同等のe.printStackTrace

Javaでは、これは次のことを行います(docs):

public void printStackTrace()

このスロー可能オブジェクトとそのバックトレースを標準エラーストリームに出力します...

これは次のように使用されます:

try
{ 
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}

Javaでは、標準エラーストリームはバッファリングされないため、出力はすぐに到着します。

Python 2と同じセマンティクスは次のとおりです。

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

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ではprintwithを使用しflush=Trueます。


3

他の偉大な答えに加えて、我々は、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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.