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开发vim插件及心得分享
Nov 04 Python
Python中集合类型(set)学习小结
Jan 28 Python
Python中static相关知识小结
Jan 02 Python
浅谈flask中的before_request与after_request
Jan 20 Python
python如何对实例属性进行类型检查
Mar 20 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
django框架两个使用模板实例
Dec 11 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
python可视化之颜色映射详解
Sep 15 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
我的论坛源代码(六)
2006/10/09 PHP
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
一个基于jquery的图片切换效果
2010/07/06 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python多线程实现同步的四种方式
2017/05/02 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
python 实现客户端与服务端的通信
2020/12/23 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
图书馆标语
2014/06/19 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
焦点访谈观后感
2015/06/11 职场文书
春风化雨观后感
2015/06/11 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书