Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)


Posted in Python onJune 23, 2020

假设我们有一段程序,从 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 列表为空。

我们运行一下看看:

Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)

报错了,说明Redis 中的某一条数据有问题。你想看看这条有问题的数据,但是现在程序已经崩溃了,进程结束了,这条有问题的数据也就永久丢失了。你再也不可能知道它长什么样了。

玩过《火焰纹章-风花雪月》的朋友都知道,主角有一个技能叫做天刻之脉动,如果队友死了,他可以逆转时间,回到队友被杀之前,从而改变队友的命运。

那么,在Python里面我们有没有什么办法让程序起死回生,看到当初导致程序报错的那一行代码呢?如果你是使用python3 xxx.py运行的程序,那么确实,除非你能重新导入刚才的数据,否则无法知道。

但是,如果你是使用如下命令:python3 -i xxx.py启动的程序,那么世界就不一样了,你的程序获得了起死回生的能力。你可以重新回到事故现场。

我们恢复一下 Redis 的数据(当然,在生产环境里面你可能就没有办法恢复了。但现在写文章的示例数据,我还是可以回复的^_^)

然后使用python3 -i read_name.py重新运行这个程序:

Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)

可以看到,现在虽然程序崩溃了,但是却出现了 Python 的交互环境。进程并没有完全退出。这样一来,我们就可以输入魔法指令,让程序倒退回到报错的那个地方。输入命令:

import pdbpdb.pm()

运行效果如下图所示:

Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)

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

Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)

原来,这一条有问题的数据,是把name写成了name1。

总结

pdb是Python自带的调试工具。我们使用的PyCharm的调试功能,也是基于pdb实现的。

到此这篇关于Python 程序报错崩溃后如何倒回到崩溃的位置的文章就介绍到这了,更多相关Python 程序报错崩溃内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
MySQL最常见的操作语句小结
May 07 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
Python对数据库操作
Mar 28 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
python实现简易内存监控
Jun 21 Python
python调用百度语音识别api
Aug 30 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
Python中请不要再用re.compile了
Jun 30 Python
Python使用进程Process模块管理资源
Mar 05 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
浅谈pytorch中的BN层的注意事项
Jun 23 #Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 #Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 #Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 #Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 #Python
python2和python3哪个使用率高
Jun 23 #Python
python使用QQ邮箱实现自动发送邮件
Jun 22 #Python
You might like
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
vue中如何添加百度统计代码
2020/12/19 Vue.js
python实现dict版图遍历示例
2014/02/19 Python
python多重继承实例
2014/10/11 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
Python中正则表达式的用法总结
2019/02/22 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
三下乡活动方案
2014/01/31 职场文书
校园公益广告语
2014/03/13 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
学生会自荐信
2019/05/16 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript