【问题标题】:getting stack frames of a function in exception context在异常上下文中获取函数的堆栈帧
【发布时间】:2013-04-04 10:29:55
【问题描述】:

在下面的示例代码中,我打算获取修饰函数的被调用者的堆栈帧。假设,装饰函数,power(下面),调用 pwr 函数并且有一个例外,我想获取 pwr 的堆栈帧(打印函数参数)。对于在 api 中公开的函数,它的参数和响应被打印,但是模块内部的函数和 api 调用的函数,我想得到那些堆栈帧。

import inspect
def api(func):
    def decor(*args, **kwargs):
        try:
            print "Request %s %s %s" % ( func.__name__, args, kwargs)
            response = func(*args,**kwargs)
            print "response %s", response
            return response
        except Exception, e:
            print "exception in %s", func.__name__
            for frame in inspect.stack():
                print frame[3]
            raise e
    return decor

@api
def power(a,b):
    return pwr(a,b)

def pwr():
   ...
   ...

当我运行代码时,在异常期间,我从 decor 和 up 获取堆栈帧,但不是 func 或更低。有人可以推荐吗?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    如果要查看发生异常的上下文,则需要查看从sys.exc_info() 返回的第三个值(“回溯对象”)。 traceback module 有一些有用的函数来处理这些对象:你也许可以使用traceback.print_tb

    例如:

    >>> import sys, traceback
    >>> try: raise Exception()
    ... except: traceback.print_tb(sys.exc_info()[2])
    ... 
      File "<stdin>", line 1, in <module>
    

    【讨论】:

      【解决方案2】:

      您无法在函数返回或引发异常后访问该框架,因为该框架根本不再存在。如果您确实想访问函数框架以用于某些调试/分析目的并且无法修改该函数,请考虑使用sys.setprofilesys.settrace。回调将作为参数传递给框架。

      【讨论】:

      • 谢谢@bereal,我想我必须对此感到满意。
      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 2018-08-20
      • 2010-10-19
      • 2011-06-01
      • 2015-08-24
      • 2010-12-07
      • 1970-01-01
      相关资源
      最近更新 更多