假设我们有一段程序,从 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 列表为空。

我们运行一下看看:

报错了,说明Redis 中的某一条数据有问题。你想看看这条有问题的数据,但是现在程序已经崩溃了,进程结束了,这条有问题的数据也就永久丢失了。你再也不可能知道它长什么样了。

玩过《火焰纹章-风花雪月》的朋友都知道,主角有一个技能叫做天刻之脉动,如果队友死了,他可以逆转时间,回到队友被杀之前,从而改变队友的命运。

那么,在Python里面我们有没有什么办法让程序起死回生,看到当初导致程序报错的那一行代码呢?如果你是使用python3 xxx.py运行的程序,那么确实,除非你能重新导入刚才的数据,否则无法知道。

但是,如果你是使用如下命令:python3 -i xxx.py启动的程序,那么世界就不一样了,你的程序获得了起死回生的能力。你可以重新回到事故现场。

我们恢复一下 Redis 的数据(当然,在生产环境里面你可能就没有办法恢复了。但现在写文章的示例数据,我还是可以回复的^_^)

然后使用python3 -i read_name.py重新运行这个程序:

可以看到,现在虽然程序崩溃了,但是却出现了 Python 的交互环境。进程并没有完全退出。这样一来,我们就可以输入魔法指令,让程序倒退回到报错的那个地方。输入命令:

import pdbpdb.pm()

运行效果如下图所示:

现在,我们已经回到了报错的那一行了。报错报的是 data这个字典没有name这个 key,那么我们就来看看这个字典里面有什么,直接输入变量名 data:

原来,这一条有问题的数据,是把name写成了name1。

总结

pdb是Python自带的调试工具。我们使用的PyCharm的调试功能,也是基于pdb实现的。

Python 程序报错崩溃后,如何倒回到崩溃的位置?的更多相关文章

  1. 运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

    运行编译后的程序报错  error while loading shared libraries: lib*.so: cannot open shared object file: No such f ...

  2. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  3. Window7中Eclipse运行MapReduce程序报错的问题

    按照文档:http://www.micmiu.com/bigdata/hadoop/hadoop2x-eclipse-mapreduce-demo/安装配置好Eclipse后,运行WordCount程 ...

  4. 记录微信小程序报错 Unexpected end of JSON input;at pages/flow/checkout page getOrderData function

    微信小程序报错 Unexpected end of JSON input;at pages/flow/checkout page getOrderData function 这个报错是在将数组对象通过 ...

  5. 小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2

    我这里出现此错误的原因是,搭载域名网站的服务器是windows2008 r2,配置的域名证书是TLS1.0版本,需要在服务器注册表中加入TLS的其他版本. 处理办法如下 小程序报错 TLS 版本必须大 ...

  6. eclipse下执行maprdeuc程序报错 java.lang.ClassNotFoundException

    最近遇到一个问题,不知怎么突然运行hadoop的map程序报错,困扰了我很久,现在来给大家分享分享.. 错误信息 2017-05-18 21:34:22,104 INFO [main] client. ...

  7. 第一次打开pycharm运行python文件报错”No Python interpreter selected“问题的解决办法

    前面没有细讲,这里细述一下安装pycharm后,第一次打开pycharm运行python文件报错"No Python interpreter selected"问题的解决办法. 出 ...

  8. eclipse运行hadoop程序报错:Connection refused: no further information

    eclipse运行hadoop程序报错:Connection refused: no further information log4j:WARN No appenders could be foun ...

  9. mycat偶尔会出现JVM报错double free or corruption并崩溃退出

    mycat偶尔会出现JVM报错double free or corruption并崩溃退出 没有复杂的sql,也没有大量的io INFO | jvm | // :: | *** Error in `j ...

随机推荐

  1. 2020年,为什么我们应该使用abapGit代替SAPLink

    SAPLink是一个帮助人们分享开发内容的工具.通过它,人们可以将ABAP开发对象从一个系统打包下载.再上传到另一个系统中.对于各种类型的开发者,它都可以起到作用: 有的开发者喜欢在不同的项目中复制相 ...

  2. 50个SQL语句(MySQL版) 问题七

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  3. Chisel3 - Tutorial - Tbl

    https://mp.weixin.qq.com/s/e8vJ8claauBtiuedxYYaJw   实现可以动态索引的表.   参考链接: https://github.com/ucb-bar/c ...

  4. HashMap1.7和1.8,红黑树原理!

    jdk 1.7 概述 HashMap基于Map接口实现,元素以键值对的方式存储,并允许使用null键和null值,但只能有一个键作为null,因为key不允许重复,另外HashMap不能保证放入元素的 ...

  5. MyBatis(二)参数传递和自定义结果集

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.myBatis的注解使用方式 package com.webcode.mapper; import ...

  6. Linux 文件系统常用命令

    文件系统查看命令df df:查看分区,单位默认是KB df -h 统计目录或文件大小du du /etc/:会列出/etc/目录下的所有子目录所占的空间,最后给出/etc/目录的大小,属于高负载命令, ...

  7. IDEA2020年激活码

    若出现无法使用,激活失败的情况,可以关注公众号:凌晨四点的程序员,回复消息"IDEA"持续更新最新激活码 2020年05月26更新(2020年6月份) OI7FTW2137-eyJ ...

  8. 关于VMware虚拟机启动EFI/UEFI支持

    作为较新计算机和操作系统用于引导计算机的技术,可扩展固件接口 (EFI) 正在取代 BIOS.EFI 有时称为统一可扩展固件接口 (UEFI). 使用VMware创建虚拟机,默认还是会使用传统的BIO ...

  9. JSP+SSM+Mysql实现的学生成绩管理系统

    项目简介 项目来源于:https://gitee.com/z77z/StuSystem 本系统是基于JSP+SSM+Mysql实现的学生成绩管理系统.主要实现的功能有教师管理.学生管理.课程管理.学生 ...

  10. Entity Framework Core遇到的问题汇总

    1.add-migration : 无法将“add-migration”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 使用E ...