其他
起死回生!程序报错崩溃后,如何倒回到崩溃的位置?
The following article is from 未闻Code Author kingname
IT服务圈儿
有温度、有态度的IT自媒体平台
来源:未闻Code(ID:itskingname)
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()
json.loads
解析成字典。然后读取字典中的name
对应的值。一直读到Redis 列表为空。我们运行一下看看:报错了,说明Redis 中的某一条数据有问题。你想看看这条有问题的数据,但是现在程序已经崩溃了,进程结束了,这条有问题的数据也就永久丢失了。你再也不可能知道它长什么样了。玩过《火焰纹章-风花雪月》的朋友都知道,主角有一个技能叫做天刻之脉动,如果队友死了,他可以逆转时间,回到队友被杀之前,从而改变队友的命运。那么,在Python里面我们有没有什么办法让程序起死回生,看到当初导致程序报错的那一行代码呢?如果你是使用python3 xxx.py
运行的程序,那么确实,除非你能重新导入刚才的数据,否则无法知道。但是,如果你是使用如下命令:python3 -i xxx.py
启动的程序,那么世界就不一样了,你的程序获得了起死回生的能力。你可以重新回到事故现场。我们恢复一下 Redis 的数据(当然,在生产环境里面你可能就没有办法恢复了。但现在写文章的示例数据,我还是可以回复的^_^)然后使用python3 -i read_name.py
重新运行这个程序:可以看到,现在虽然程序崩溃了,但是却出现了 Python 的交互环境。进程并没有完全退出。这样一来,我们就可以输入魔法指令,让程序倒退回到报错的那个地方。输入命令:import pdb
pdb.pm()
data
这个字典没有name
这个 key,那么我们就来看看这个字典里面有什么,直接输入变量名 data
:原来,这一条有问题的数据,是把name
写成了name1
。总结
pdb是Python自带的调试工具。我们使用的PyCharm的调试功能,也是基于pdb实现的。它还支持更多高级用法,大家可以阅读官方文档pdb — The Python Debugger — Python 3.8.3 documentation[1]。参考资料
[1]pdb — The Python Debugger — Python 3.8.3 documentation: https://docs.python.org/3/library/pdb.html
*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。