スタック トレースは Python では便利ですが、ほとんどの場合、問題の根本にあるデータが欠落しています。少なくとも locals() (およびおそらく globals()) が印刷されたスタック トレースに追加されていることを確認する方法はありますか?
2154 次
4 に答える
13
独自の例外フックをインストールして、そこから必要なものを出力できます。
import sys, traceback
def excepthook(type, value, tb):
traceback.print_exception(type, value, tb)
while tb.tb_next:
tb = tb.tb_next
print >>sys.stderr, 'Locals:', tb.tb_frame.f_locals
print >>sys.stderr, 'Globals:', tb.tb_frame.f_globals
sys.excepthook = excepthook
def x():
y()
def y():
foo = 1
bar = 0
foo/bar
x()
トレースバックの各フレームから変数を出力するには、上記のループを次のように変更します。
while tb:
print >>sys.stderr, 'Locals:', tb.tb_frame.f_locals
print >>sys.stderr, 'Globals:', tb.tb_frame.f_globals
tb = tb.tb_next
于 2013-10-22T10:44:27.287 に答える
4
パンドラの箱です。値は、印刷された形式では非常に大きくなる可能性があります。スタック トレースにすべてのローカルを出力すると、エラー出力が原因で新しい問題が発生しやすくなります。そのため、これは一般に Python では実装されていません。
ただし、小さな例では、つまり、値が大きすぎて適切に出力できないことがわかっている場合は、自分でトレースバックをたどることができます。
import sys
import traceback
def c():
clocal = 1001
raise Exception("foo")
def b():
blocal = 23
c()
def a():
alocal = 42
b()
try:
a()
except Exception:
frame = sys.exc_info()[2]
formattedTb = traceback.format_tb(frame)
frame = frame.tb_next
while frame:
print formattedTb.pop(0), '\t', frame.tb_frame.f_locals
frame = frame.tb_next
出力は次のようになります。
File "/home/alfe/tmp/stacktracelocals.py", line 19, in <module>
a()
{'alocal': 42}
File "/home/alfe/tmp/stacktracelocals.py", line 16, in a
b()
{'blocal': 23}
File "/home/alfe/tmp/stacktracelocals.py", line 12, in b
c()
{'clocal': 1001}
もちろん、thg435 が彼の回答で提案したように、独自の except フックをインストールすることもできます。
于 2013-10-22T11:04:34.233 に答える