Python调试——从 traceback 中获得更多信息

任务

当一个未被捕获的异常发生时,你希望能够打印出所有变量的信息

解决方案

一个 traceback 对象,基本上是一个互相关联的节点的列表,每个节点都指向一个帧对象(frame )。而帧对象则反过来根据 traceback 的关联节点列表以相反的顺序建立它们自己的链表,所以,我们可以根据需要向前或向后移动。如下代码利用了帧的对应函数的局部变量的 字典:

import sys,traceback
def print_exc_plus():
    '打印通常的回溯信息,且附有每帧中的局部变量的列表'
    tb=sys.exc_info()[2]    #返回当前异常的(type,value,traceback)
    while tb.tb_next:
        tb=tb.tb_next    #栈中的下一个traceback对象
    stack=[]
    f=tb.tb_frame #每个traceback对应一个帧
    while f:
        stack.append(f) #stack存放指向帧对象的所有引用
        f=f.f_back
    stack.reverse()
    traceback.print_exc()
    print('locals by frame,innermost last')
    for frame in stack:
        print('Frame %s in %s at line %s'%(frame.f_code.co_name,
                                           frame.f_code.co_filename,
                                           frame.f_lineno))
    for key,value in frame.f_locals.items(): #f_locals指向该帧的局部变量的字典
        print('%20s='%key,end='')
        #我们必须_绝对_避免异常的扩散,而str(value)
        #_能够_引发任何异常,所以我们_必须_捕获所有异常
        try:
            print(value)
        except:
            print("<ERROR WHILE PRINTING VALUE>")

如下是一个简单的测试示例:

def pad4(seq):
    return_value=[]
    for thing in map(str,seq):
        return_value.append('0'*(4-len(thing))+thing)
    return return_value

data=['1','2',3,'4']
try:
    print(pad4(data))
except:
    print_exc_plus()

如下,红色部分的提示信息是从traceback.print_exc()获得的信息,蓝色部分的信息是我们的函数额外获取的信息。

可以将所有相信的信息写入一个日志文件,以备日后分析。在交互式状态下抛出这么多的信息可能会让人无从下手,而悄悄地把这些信息写入日志文件,对于开发者和用户都是可以接受的。日志文件中的信息就像是一片宝石矿:宝石就在里面,你只要有时间与筛查,就能找到宝石。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值