Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)

作者:吃着东西不想停 时间:2021-01-08 16:14:34 

假设我们有一段程序,从 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实现的。

来源:https://www.cnblogs.com/zwhy8/archive/2020/06/22/13179379.html

标签:Python,程序,崩溃
0
投稿

猜你喜欢

  • ACCESS中Field对象的标题属性

    2008-11-20 17:44:00
  • asp如何做一个只能从本站点才能访问的页面?

    2010-07-12 19:00:00
  • 纯CSS圆角框2-透明圆角化背景图片

    2009-12-11 19:10:00
  • 几个javascript特效代码

    2010-04-23 20:39:00
  • 在ORACLE里设置访问多个SQL Server数据库

    2007-08-17 10:18:00
  • java前端javascript生成动态表格示例演示

    2023-08-24 11:13:45
  • python有证书的加密解密实现方法

    2023-02-10 08:07:30
  • Python寻找路径和查找文件路径的示例

    2023-05-01 10:36:37
  • sqlserver 2000中创建用户的图文方法

    2012-03-26 18:26:39
  • python爬虫实战之制作属于自己的一个IP代理模块

    2021-12-23 21:42:20
  • python标准库之time模块的语法与简单使用

    2023-06-11 17:42:23
  • SQL 统计一个数据库中所有表记录的数量

    2012-01-29 18:21:36
  • 解析:轻松掌握在 Mac OS X中安装MySQL

    2009-01-14 11:51:00
  • python实现定时发送邮件

    2022-12-20 07:49:49
  • 解决sublime+python3无法输出中文的问题

    2023-09-20 16:26:20
  • 基础语音识别-食物语音识别baseline(CNN)

    2023-04-05 22:44:11
  • Python装饰器如何实现修复过程解析

    2023-11-22 04:27:43
  • asp查询xml的代码 不刷新页面查询的方法

    2011-04-06 11:00:00
  • TensorFlow中tf.batch_matmul()的用法

    2022-06-06 10:33:37
  • 浅谈Scrapy网络爬虫框架的工作原理和数据采集

    2023-08-24 22:17:21
  • asp之家 网络编程 m.aspxhome.com