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使用MySQLdb访问mysql数据库的方法
Aug 03 Python
利用python画一颗心的方法示例
Jan 31 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
使用tensorflow实现线性svm
Sep 07 Python
详解用python计算阶乘的几种方法
Aug 14 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
Python ellipsis 的用法详解
Nov 20 Python
Python 使用dict实现switch的操作
Apr 07 Python
Python 图片添加美颜效果
Apr 28 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
PHP中Session的概念
2006/10/09 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
浅析JavaScript动画
2015/06/10 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
python开启多个子进程并行运行的方法
2015/04/18 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
python自动12306抢票软件实现代码
2018/02/24 Python
python中几种自动微分库解析
2019/08/29 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
如何用Python 加密文件
2020/09/10 Python
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
应届生高等护理求职信
2013/10/12 职场文书
博士生入学考试推荐信
2013/11/17 职场文书
小学新教师培训方案
2014/02/03 职场文书
初三英语教学计划
2015/01/23 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
关于教师节的广播稿
2015/08/19 职场文书
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技