在下面的示例代码中,我打算获取装饰函数的被调用者的堆栈帧。假设,修饰函数,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():
...
...
当我运行代码时,在异常期间,我从装饰中获取堆栈帧,但不是func或以下。有人可以建议吗?
答案 0 :(得分:2)
如果要查看发生异常的上下文,则需要查看从sys.exc_info()
返回的第三个值(“traceback object”)。 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>
答案 1 :(得分:0)
在返回或引发函数和异常后,您无法访问该框架,因为框架不再存在。如果您确实想要访问功能框架以进行某些调试/分析,并且无法修改该功能,请考虑使用sys.setprofile
或sys.settrace
。回调将作为参数传递给帧。