社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 程序报错崩溃后,如何倒回到崩溃的位置?

Python编程时光 • 5 年前 • 605 次点击  

点击上方“Python编程时光”,选择“加为星标

第一时间关注Python技术干货!

后台回复关键字 “黑魔法”,即可获取明哥整理的《Python黑魔法指南


假设我们有一段程序,从 Redis 中读取数据,解析以后提取出里面的 name 字段:

import jsonimport 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实现的。它还支持更多高级用法,大家可以阅读官方文档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





另外对文章有任何疑问,欢迎扫描下面二维码,加我微信进行交流。






推荐阅读




太赞了!《Python 黑魔法指南》终于面世了

写出漂亮 Python 代码的 20条准则

一些我日常使用的 Python 技巧分享

Python 3.9 beta2版本的7个新的PEP都是什么?

涨见识了,在终端执行 Python 代码的 6 种方式

Github上这些可视化面板也太好看了吧

5年 Python 功力,总结了 10 个开发技巧



长按下图  ➡   关注博主

(按左边关注 Python, 按右边关注 Goalng





      



 

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70301
 
605 次点击