在异常上下文中获取函数的堆栈帧

2024-06-16 14:00:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的示例代码中,我打算获取修饰函数的被调用方的堆栈帧。假设修饰函数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或belower。有人能建议吗?在


Tags: 函数代码api参数return堆栈responsedef
2条回答

如果要查看异常发生的上下文,则需要查看从^{}返回的第三个值(“回溯对象”)。^{} module有一些处理这些对象的有用函数:您可以使用^{}。在

例如:

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

在函数返回或引发以及异常之后,不能访问该框架,因为该框架已不存在。如果您确实想访问函数框架以进行某些调试/分析,并且无法修改函数,请考虑使用^{}^{}。回调将作为参数传递给帧。在

相关问题 更多 >