【问题标题】:print python stack trace without exception being raised打印python堆栈跟踪,没有异常被引发
【发布时间】:2010-10-13 15:20:47
【问题描述】:

我的班级的一个实例变量发生了一些事情。我想使变量成为一个属性,并且每当访问它时,我都想打印出直到该点的所有代码的堆栈跟踪,这样我就可以看到它在哪里被弄乱了。没有引发异常时如何打印堆栈跟踪?我知道如果有异常我可以做类似traceback.format_tb(sys.exc_info()[2]) 的事情。

另外,可能有用的是只打印最后 3-4 个级别,因为前几个级别可能不会那么有趣。

【问题讨论】:

    标签: python debugging stack-trace


    【解决方案1】:

    traceback.print_stack():

    >>> def f():
    ...   def g():
    ...     traceback.print_stack()
    ...   g()
    ...
    >>> f()
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in f
      File "<stdin>", line 3, in g
    

    编辑:您也可以使用 extract_stack,获取切片(例如,stack[5:] 用于排除前 5 个级别)并使用 format_list 获取可打印的堆栈跟踪 ('\n'.join(traceback.format_list(...)))

    【讨论】:

    • 感谢您的编辑,它帮助我使用this answer 获得了一个非常通用的full_stack() 功能!
    【解决方案2】:

    如果您需要将字符串传递给记录器,您可以使用,而不是打印到标准输出:

    ''.join(traceback.format_stack())
    

    注意,traceback.format_stack() 将堆栈跟踪作为格式化的字符串列表返回,因此您可以根据需要对其进行切片。要获取堆栈跟踪的最后几个元素,您可以这样做:

    ''.join(traceback.format_stack()[-N:])
    

    其中 N 是您感兴趣的级别数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-04
      • 2011-01-18
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多