为什么错误回溯显示编辑后的脚本而不是实际运行的脚本?

2024-03-30

背景

考虑以下最小示例:

当我保存以下脚本并从终端运行它时,

import time

time.sleep(5)
raise Exception

该代码将在休眠五秒后引发错误,并留下以下回溯。

回溯(最近一次调用最后一次):
文件“test/minimal_error.py”,第 4 行,位于
引发异常
例外

现在,假设我运行脚本,并在 5 秒睡眠期间,在中间添加一行。

import time

time.sleep(5)
a = 1
raise Exception

当Python解释器从睡眠中醒来并到达下一行后,raise Exception,它会引发错误,但会留下以下回溯。

回溯(最近一次调用最后一次):
文件“test/minimal_error.py”,第 4 行,位于
一个= 1
例外

所以明显的问题是它没有打印导致错误的实际代码。尽管它给出了正确的行号(正确反映了正在运行的脚本的版本,虽然可以理解是无用的)和正确的错误消息,但我真的不知道哪一段代码实际上导致了错误。

在实际实践中,我实现了程序的一部分,运行它以查看该部分是否运行良好,当它仍在运行时,我继续进行下一个必须实现的事情。当脚本抛出错误时,我必须找到哪一行实际代码导致了错误。我通常只是阅读错误消息并尝试推断导致该错误的原始代码。有时不容易猜测,所以我将脚本复制到剪贴板,并通过在运行脚本后撤消我编写的内容来回滚代码,检查导致错误的行,然后从剪贴板粘贴回来。

Question

口译员显示的原因是否有任何可以理解的原因a = 1,这是代码“当前”版本的第 4 行,而不是raise Exception,这是代码“正在运行”版本的第 4 行?如果解释器知道“第 4 行”导致了错误并且错误消息是“Exception”,为什么它不能说出该命令raise Exception提出来了吗?

我不太确定这个问题是否与主题相关,但我认为我不能从主题中得出结论帮助中心 https://stackoverflow.com/help/on-topic说。我认为它是关于“程序员常用的[一种]软件[工具]”(Python解释器),并且是“软件开发所特有的一个实用的、可回答的问题”。我不认为这是基于意见的,因为这种实施选择应该有一个理由。

(在 Python 2.7.16、3.6.8、3.7.2 和 3.7.3 中观察到同样的情况,所以它似乎不是特定于版本的,而是 Python 中发生的事情。)


直接原因是Python重新打开文件并再次读取指定行以将其打印在错误消息中。那么,当它一开始就已经读取了文件时,为什么还需要这样做呢?因为它不会将源代码保存在内存中,只保存生成的字节码。

事实上,Python 永远不会将源文件的全部内容一次性保存在内存中。相反,词法分析器将从文件中读取并一次生成一个标记,然后解析器将其解析并转换为字节代码。一旦解析器处理完一个令牌,它就消失了。

因此,恢复原始源代码的唯一方法是再次打开源文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么错误回溯显示编辑后的脚本而不是实际运行的脚本? 的相关文章

随机推荐

  • javascript闭包立即评估[重复]

    这个问题在这里已经有答案了 考虑以下 JavaScript 代码 var a var f function for var i 0 i lt 3 i a push function alert i for var j 0 j lt 3 j
  • 如何使用 Haskell Aeson 解析数组

    我有一个 JSON 文档 如下所示 series 1 2 2 3 3 4 我想将其解析为一组数据类型 data Series Series DataPoint data DataPoint DataPoint Int Int x and y
  • 为什么我的 MongoDB $or 查询不起作用?

    我正在尝试执行 or 搜索来匹配两个正则表达式 如下所示 metadata text or regex hello regex world 我正在使用 mlab com 并收到以下错误 MongoDB error Command faile
  • 使用twig变量动态调用导入的宏子函数

    我正在尝试是否使用变量来调用特定的宏名称 我有一个正在导入的宏文件 import form elements html twig as forms 现在该文件中包含所有表单元素宏 文本 文本区域 选择 单选等 我有一个传入的数组变量 其中包
  • Groovy 相对于 Jython 或 Jruby 的优势?

    当我可以使用 Jython 或 Jruby 时 为什么我要选择使用 Groovy 该语言是否提供了任何固有的优势来弥补 Jython 和 Jruby 技能适用于 JVM 之外的其父语言的事实 请记住 我故意保持这个问题的通用性 但如果特定领
  • 为什么灯光出现在对面?

    我正在尝试使用构建照明this https learnopengl com Lighting Basic Lighting教程 但是 灯光出现在人体物体的错误一侧 我不知道为什么 法线是按三角形创建的 三角形的顶点基本上具有相同的法线 gl
  • 如何让 Spring XD 在启动时部署一组预定义的流和 Tap

    有没有办法在启动 spring xd 的新实例时启动一组已定义的 steam 和 tap 场景是这样的 我们已经在开发系统上完成了一些原型设计 但现在我们想要构建并将其发布给测试团队 我们希望自动化大部分后台工作 用户只需担心流的输出 而不
  • 为具有特定标题的通用狮身人面像警告定义标记

    我正在使用 Sphinx 为 Python 程序生成 HTML 文档 我想使用generic admonition http docutils sourceforge net docs ref rst directives html gen
  • 简单会员资格:用户上次登录日期

    我在我的 asp net MVC 4 应用程序中使用简单成员资格 我如何获取用户的上次登录日期 我没有看到默认网页架构表中创建的日期 我是否需要在简单会员资格中创建 LastLogin 日期字段 谢谢 我已经这样解决了 我在 UsersCo
  • 使用 Lottie 自定义 UIRefreshControl

    我的目标是替换默认的微调器UIRefreshControl与洛蒂动画 我的问题是 当我拉下动画时 动画不会立即播放UICollectionView其子视图是UIRefreshControl 仅当我稍微向下滚动并暂停手指时才会播放动画 当我再
  • 通配符子域不适用于实时服务器上的静态子域

    我通过创建子域将项目部署在实时服务器上app example net在c面板上 并将我的项目放入app example net文件夹 在我的项目中 我有两个路线组 如下所示 路线 php
  • 如何将 SQL Server 错误日志文件移动到新位置?

    我的 C 盘上的默认 SQL Server 日志目录已满 如何移动SQL Server错误日志默认目录 Use the SQL Configuration Manager 以下是更改启动以使用不同目录的步骤 完成后重新启动服务器
  • 如何使用 html 和 css 创建一个小颜色框?

    我在 html 文件 网站上有一张图片 我想添加该图片的可用颜色列表 我想创建非常小的盒子或点 一个适合每种颜色的小盒子 我怎样才能做到这一点 Thanks 对于旧的浏览器 您经常会使用float https developer mozil
  • 适用于所有模板的 Django Python base.html

    在我的根目录中 我有一个模板 在该模板内后面跟着一个base html这将是我的自定义管理网站的主要布局 In my templates admin base html我有这个代码 block content endblock 我要这个ba
  • 如何在 http 响应正文中返回编码字符串?

    将编码字符串添加到 http 响应似乎会用 F MISSING 替换某些字符 如何防止这种情况发生 Output encodedText M6c8RqL61nMFy F 缺失 hQmciSYrh9ZXgVFVjO Code package
  • 在方法调用中传递“this”是java中可接受的做法

    在方法调用中传递当前对象是好 坏 可接受的做法 如 public class Bar public Bar public void foo Baz baz modify some values of baz public class Baz
  • 如何使用 CLI 在 Windows 操作系统中将 Node.js 6.x 更新到 8.x

    我无法在 Node js 6 x 上运行 Angular 6 CLI 它显示错误 升级最低 Node js 8 xx 以使用 Angular CLI 我尝试使用以下代码 npm install g npm windows upgrade n
  • Java 编译器:停止抱怨死代码

    出于测试目的 我经常开始在现有项目中输入一些代码 因此 我想要测试的代码位于所有其他代码之前 如下所示 public static void main String args char a System out println int a
  • C++ 变量定义中的“class”关键字

    在有人问之前 是的 这是家庭作业的一部分 是的 在问之前我做了很多谷歌搜索 我花了最后一个小时在谷歌上用很多很多不同的关键词进行了集中搜索 但就是找不到任何东西 那么问题来了 下面的变量定义是什么意思 class MyClass myCla
  • 为什么错误回溯显示编辑后的脚本而不是实际运行的脚本?

    背景 考虑以下最小示例 当我保存以下脚本并从终端运行它时 import time time sleep 5 raise Exception 该代码将在休眠五秒后引发错误 并留下以下回溯 回溯 最近一次调用最后一次 文件 test minim