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命令行参数解析模块optparse使用实例
Apr 13 Python
Python之list对应元素求和的方法
Jun 28 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
Django 大文件下载实现过程解析
Aug 01 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
pyqt5中动画的使用详解
Apr 01 Python
基于Python 的语音重采样函数解析
Jul 06 Python
Python如何解除一个装饰器
Aug 07 Python
Python爬取12306车次信息代码详解
Aug 12 Python
pycharm 的Structure界面设置操作
Feb 05 Python
python re模块和正则表达式
Mar 24 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 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投票系统防刷票判断流程分析
2012/02/04 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python 2.6.6升级到python 2.7.x版本的方法
2016/10/09 Python
Python切片操作深入详解
2018/07/27 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python 构造三维全零数组的方法
2018/11/12 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python类中super() 的使用解析
2019/12/19 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
护理学中专毕业生求职信
2013/11/11 职场文书
简历里的自我评价
2014/01/31 职场文书
国企干部对照检查材料
2014/08/22 职场文书
2014年招生工作总结
2014/11/26 职场文书
2014年药品销售工作总结
2014/12/16 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
SQL Server中的游标介绍
2022/05/20 SQL Server