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 27 Python
Python的Django框架中的数据过滤功能
Jul 17 Python
深入解析Python中的urllib2模块
Nov 13 Python
Python实时获取cmd的输出
Dec 13 Python
用Python3创建httpServer的简单方法
Jun 04 Python
学习python的前途 python挣钱
Feb 27 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
python输出pdf文档的实例
Feb 13 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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截取中文字符串的问题
2006/07/12 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
python中字典增加和删除使用方法
2020/09/30 Python
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
幼教简历自我评价
2014/01/28 职场文书
劳动之星获奖感言
2014/02/01 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
欠条格式范本
2015/07/03 职场文书