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 相关文章推荐
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
Python 打印中文字符的三种方法
Aug 14 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
parser.add_argument中的action使用
Apr 20 Python
在TensorFlow中实现矩阵维度扩展
May 22 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
python Gabor滤波器讲解
Oct 26 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实现股票趋势图和柱形图
2015/02/07 PHP
php创建无限级树型菜单
2015/11/05 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
Python字符串格式化
2015/06/15 Python
详解python进行mp3格式判断
2016/12/23 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
python+flask实现API的方法
2018/11/21 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Pytorch中.new()的作用详解
2020/02/18 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
门卫工作岗位职责
2013/12/17 职场文书
护士自我评价
2014/02/01 职场文书
鲜花方阵解说词
2014/02/13 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
自荐信格式范文
2015/03/04 职场文书