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自定义类的数组排序实现代码
Aug 28 Python
python 二分查找和快速排序实例详解
Oct 13 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python 函数内部修改外部变量的方法
Dec 18 Python
神经网络相关之基础概念的讲解
Dec 29 Python
python如何实现数据的线性拟合
Jul 19 Python
如何通过python实现人脸识别验证
Jan 17 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
PHP 全角转半角实现代码
2010/05/16 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
python中取绝对值简单方法总结
2020/07/24 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
工程部主管岗位职责
2013/11/17 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS