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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
python 异或加密字符串的实例
Oct 14 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
python分布式编程实现过程解析
Nov 08 Python
如何分离django中的媒体、静态文件和网页
Nov 12 Python
Python中的xlrd模块使用整理
Jun 15 Python
什么是Python装饰器?如何定义和使用?
Apr 11 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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 array操作10个小技巧分享
2011/06/23 PHP
如何让CI框架支持service层
2014/10/29 PHP
php上传文件常见问题总结
2015/02/03 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
深入认识javascript中的eval函数
2009/11/02 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
canvas绘制七巧板
2017/02/03 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
ES6基础之默认参数值
2019/02/21 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
Python 绘图和可视化详细介绍
2017/02/11 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python实现简单俄罗斯方块
2020/03/13 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
团员个人的自我评价
2013/12/02 职场文书
考核评语大全
2014/04/29 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
销售经理工作检讨书
2015/02/19 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书