代码之家  ›  专栏  ›  技术社区  ›  Nick Retallack monkut

如何以编程方式检查Python中异常的堆栈跟踪?

  •  18
  • Nick Retallack monkut  · 技术社区  · 16 年前

    当Python中发生异常时,可以检查堆栈吗?你能确定它的深度吗?我已经看过了 traceback 模块,但我不知道怎么用。

    我的目标是捕获eval表达式解析过程中发生的任何异常,而不捕获它可能调用的任何函数引发的异常。别责怪我用eval。这不是我的决定。

    注意:我想以编程的方式,而不是交互的方式。

    5 回复  |  直到 14 年前
        1
  •  6
  •   AndiDog    16 年前
        2
  •  14
  •   jalanb Yaakov Bressler    11 年前

    traceback 已经足够了——我想文档对它的描述相当好。简化示例:

    import sys
    import traceback
    
    try:
        eval('a')
    except NameError:
        traceback.print_exc(file=sys.stdout)
    
        3
  •  5
  •   bodo    13 年前

    我喜欢追踪模块。

    可以使用 sys.exc_info() . 然后,您可以使用该对象获得一个列表,该列表是使用 traceback.extract_tb() . 然后您可以使用 traceback.format_list()

    import sys
    import traceback, inspect
    
    try:
        f = open("nonExistant file",'r')
    except:
        (exc_type, exc_value, exc_traceback) = sys.exc_info()
        #print exception type
        print exc_type
        tb_list = traceback.extract_tb(sys.exc_info()[2])
        tb_list = traceback.format_list(tb_list)
        for elt in tb_list:
            print elt
            #Do any processing you need here.
    

    参见系统模块: http://docs.python.org/library/sys.html

    以及回溯模块: http://docs.python.org/library/traceback.html

        4
  •  2
  •   alinsoar    13 年前

    你定义了这样一个函数( doc here ):

    def raiseErr():
       for f in inspect.stack(): print '-', inspect.getframeinfo(f[0])
    

    从你的模块中调用它,这样:

    raiseErr()
    

    函数 提升机

    更详细地说,您可以这样做:

    import inspect, traceback
    A = [inspect.getframeinfo(f[0]) for f in inspect.stack()]
    print "traceback structure fields:", filter(lambda s: s[0] != '_', dir(A[0]))
    print A[0].filename, A[0].lineno
    for f in inspect.stack():
        F = inspect.getframeinfo(f[0])
        print '-', F.filename, F.lineno, '\t', F.code_context[0].strip()
    

    def tr():
        print '* - '*10,
        print sys._getframe(1).f_code.co_name
    

    在你想要追踪的地方打电话。如果需要所有跟踪,请在中从1开始创建一个迭代器 _getframe(1) .

        5
  •  0
  •   Peter Hansen    16 年前

    inspect ,注意 pdb pdb.py 可能对你学习如何做这些事情有帮助。