Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
假设我们有一段程序,从 Redis 中读取数据,解析以后提取出里面的 name 字段:
import json
import redis
client = redis.Redis()
def read():
while True:
data = client.lpop('info')
if data:
yield json.loads(data)
else:
break
def parse():
for data in self.read():
print(data['name'])
if __name__ == '__main__':
parse()
代码的逻辑本身很简单,从 Redis 中一条一条读取数据,读到的数据是 JSON 字符串,所以先使用json.loads解析成字典。然后读取字典中的name对应的值。一直读到Redis 列表为空。
我们运行一下看看:

报错了,说明Redis 中的某一条数据有问题。你想看看这条有问题的数据,但是现在程序已经崩溃了,进程结束了,这条有问题的数据也就永久丢失了。你再也不可能知道它长什么样了。
玩过《火焰纹章-风花雪月》的朋友都知道,主角有一个技能叫做天刻之脉动,如果队友死了,他可以逆转时间,回到队友被杀之前,从而改变队友的命运。
那么,在Python里面我们有没有什么办法让程序起死回生,看到当初导致程序报错的那一行代码呢?如果你是使用python3 xxx.py运行的程序,那么确实,除非你能重新导入刚才的数据,否则无法知道。
但是,如果你是使用如下命令:python3 -i xxx.py启动的程序,那么世界就不一样了,你的程序获得了起死回生的能力。你可以重新回到事故现场。
我们恢复一下 Redis 的数据(当然,在生产环境里面你可能就没有办法恢复了。但现在写文章的示例数据,我还是可以回复的^_^)
然后使用python3 -i read_name.py重新运行这个程序:

可以看到,现在虽然程序崩溃了,但是却出现了 Python 的交互环境。进程并没有完全退出。这样一来,我们就可以输入魔法指令,让程序倒退回到报错的那个地方。输入命令:
import pdbpdb.pm()
运行效果如下图所示:

现在,我们已经回到了报错的那一行了。报错报的是data这个字典没有name这个 key,那么我们就来看看这个字典里面有什么,直接输入变量名data:

原来,这一条有问题的数据,是把name写成了name1。
总结
pdb是Python自带的调试工具。我们使用的PyCharm的调试功能,也是基于pdb实现的。
到此这篇关于Python 程序报错崩溃后如何倒回到崩溃的位置的文章就介绍到这了,更多相关Python 程序报错崩溃内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Python 如何调试程序崩溃错误
- jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
- python实现监控某个服务 服务崩溃即发送邮件报告
- 解决python多线程报错:AttributeError: Can''t pickle local object问题
- Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
- python错误:AttributeError: ''module'' object has no attribute ''setdefaultencoding''问题的解决方法
- Python进程崩溃AttributeError异常问题解决
相关文章
Python复制Excel带有条件格式的单元格sheet实现步骤
这篇文章主要为大家介绍了Python复制Excel带有条件格式的单元格sheet实现步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07
Python获取Windows或Linux主机名称通用函数分享
这篇文章主要介绍了Python获取Windows或Linux主机名称通用函数分享,本文直接给出实现代码,需要的朋友可以参考下2014-11-11
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
这篇文章主要介绍了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作,结合实例形式分析了Python闭包及闭包中的变量声明相关操作技巧,需要的朋友可以参考下2019-10-10


最新评论