背景
考虑以下最小示例:
当我保存以下脚本并从终端运行它时,
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 中发生的事情。)