是否有一种方便的方法可以在Python异常上获得更详细的堆栈跟踪?我希望找到一个包装器实用程序/模块或其他一些方法从堆栈跟踪中获取更多信息,而不必实际修改生成它的Python脚本。我希望能够在运行单元测试或doctests时,或者从shell运行实用程序或内联脚本时使用它。
具体来说,我想我想拥有局部变量的值,或者只是传递给堆栈跟踪中最内层函数的参数值。设置细节级别的一些选项很有用。
答案 0 :(得分:2)
与您的问题没有特别的关系,但您可能会发现此代码很有用 - 当发生致命异常时自动启动python调试器。适合使用交互式代码。它最初来自ActiveState
# code snippet, to be included in 'sitecustomize.py'
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
# we are in interactive mode or we don't have a tty-like
# device, so we call the default hook
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
# we are NOT in interactive mode, print the exception...
traceback.print_exception(type, value, tb)
print
# ...then start the debugger in post-mortem mode.
pdb.pm()
sys.excepthook = info
答案 1 :(得分:0)
您是否看过追溯模块?
同样在SO:
答案 2 :(得分:0)
正如pyfunc所提到的,您可以在traceback模块中使用该函数,但只能获得堆栈跟踪。
如果要检查堆栈,则必须使用sys.exc_info()函数并遍历traceback
成员并从其框架(tb_frame
)转储信息。有关这些类型的更多信息,请参阅python Reference Manual。
以下是一个例子:
def killit(a):
a[10000000000000] = 1
def test(a):
killit(a)
def iterate_traceback(tb):
while tb is not None:
yield tb
tb = tb.tb_next
try:
test(tuple())
except Exception as e:
import sys
exception_info = sys.exc_info()
traceback = exception_info[2]
for tb in iterate_traceback(traceback):
print "-" * 10
print tb.tb_frame.f_code
print tb.tb_frame.f_locals
print tb.tb_frame.f_globals