在下面的示例代码中,我打算获取修饰函数的被调用者的堆栈框架。假设,修饰后的函数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或下方。有没有人能提个建议?
发布于 2013-04-04 19:34:48
如果您想查看发生异常的上下文,则需要查看从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>发布于 2013-04-04 18:35:36
你不能在函数返回或引发异常后访问框架,因为框架已经不存在了。如果您真的想访问某个函数框架以进行某些调试/分析,并且不能修改该函数,请考虑使用sys.setprofile或sys.settrace。回调将作为参数传递给框架。
https://stackoverflow.com/questions/15808683
复制相似问题