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基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
Python3实现从文件中读取指定行的方法
May 22 Python
Python中is与==判断的区别
Mar 28 Python
Python打印“菱形”星号代码方法
Feb 05 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
python输入多行字符串的方法总结
Jul 02 Python
python2 对excel表格操作完整示例
Feb 23 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
python实现双人五子棋(终端版)
Dec 30 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 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
PHP删除非空目录的函数代码小结
2013/02/28 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
smarty简单入门实例
2014/11/28 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
django加载本地html的方法
2018/05/27 Python
python的中异常处理机制
2018/08/30 Python
Python 监测文件是否更新的方法
2019/06/10 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Python中实现输入一个整数的案例
2020/05/03 Python
Python 日期与时间转换的方法
2020/08/01 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
交通专业个人自荐信格式
2013/09/23 职场文书
亚运会口号
2014/06/20 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
初中物理教学反思
2016/02/19 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
pandas求平均数和中位数的方法实例
2021/08/04 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python