首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异常上下文中获取函数的栈帧

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

Stack Overflow用户
提问于 2013-04-04 18:29:56
回答 2查看 988关注 0票数 1

在下面的示例代码中,我打算获取修饰函数的被调用者的堆栈框架。假设,修饰后的函数power(如下)调用pwr函数,但有一个例外,我希望获得pwr的堆栈框架(打印函数参数)。对于在api中公开的函数,它的参数和响应是打印出来的,但是模块内部的函数和api调用的函数,我想要得到这些堆栈框架。

代码语言:javascript
复制
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或下方。有没有人能提个建议?

EN

回答 2

Stack Overflow用户

发布于 2013-04-04 19:34:48

如果您想查看发生异常的上下文,则需要查看从sys.exc_info()返回的第三个值( "traceback object")。对于处理这些对象,traceback module有一些有用的函数:您也许能够使用traceback.print_tb

例如:

代码语言:javascript
复制
>>> import sys, traceback
>>> try: raise Exception()
... except: traceback.print_tb(sys.exc_info()[2])
... 
  File "<stdin>", line 1, in <module>
票数 2
EN

Stack Overflow用户

发布于 2013-04-04 18:35:36

你不能在函数返回或引发异常后访问框架,因为框架已经不存在了。如果您真的想访问某个函数框架以进行某些调试/分析,并且不能修改该函数,请考虑使用sys.setprofilesys.settrace。回调将作为参数传递给框架。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15808683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档