栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取完整的追溯

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取完整的追溯

正如Mechmind回答的那样,堆栈跟踪仅由引发异常的位置与

try
块的位置之间的帧组成。如果您需要完整的堆栈跟踪,显然您不走运。

除了可以将堆栈条目从顶层提取到当前帧之外,其他一切都可以进行

traceback.extract_stack
管理。问题在于,通过所获取的信息
traceback.extract_stack
来自直接检查堆栈帧而没有在任何时候创建回溯对象的情况,并且
logging
API需要一个回溯对象来影响回溯输出。

幸运的是,

logging
不需要 实际的 追溯对象,它需要一个可以传递给
traceback
模块格式化例程的对象。
traceback
也不在乎-
它仅使用回溯的两个属性,即帧和行号。因此,应该有可能创建鸭子类型的人造回溯对象的链接列表,并将其作为回溯传递。

import sysclass FauxTb(object):    def __init__(self, tb_frame, tb_lineno, tb_next):        self.tb_frame = tb_frame        self.tb_lineno = tb_lineno        self.tb_next = tb_nextdef current_stack(skip=0):    try: 1/0    except ZeroDivisionError:        f = sys.exc_info()[2].tb_frame    for i in xrange(skip + 2):        f = f.f_back    lst = []    while f is not None:        lst.append((f, f.f_lineno))        f = f.f_back    return lstdef extend_traceback(tb, stack):    """Extend traceback with stack info."""    head = tb    for tb_frame, tb_lineno in stack:        head = FauxTb(tb_frame, tb_lineno, head)    return headdef full_exc_info():    """Like sys.exc_info, but includes the full traceback."""    t, v, tb = sys.exc_info()    full_tb = extend_traceback(tb, current_stack(1))    return t, v, full_tb

有了这些功能,您的代码仅需要进行小小的修改:

import loggingdef func():    try:        raise Exception('Dummy')    except:        logging.error("Something awful happened!", exc_info=full_exc_info())def func2():    func()func2()

…给出预期的输出:

ERROR:root:Something awful happened!Traceback (most recent call last):  File "a.py", line 52, in <module>    func2()  File "a.py", line 49, in func2    func()  File "a.py", line 43, in func    raise Exception('Dummy')Exception: Dummy

请注意,faux-traceback对象可用于自省(显示局部变量或作为自变量),

pdb.post_mortem()
因为它们包含对实际堆栈框架的引用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660803.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号