当 Python 解释器报告错误/异常时(从现在开始,我只想说“错误”来指代这两者),它会打印导致错误的行号和行的内容。
有趣的是,如果您有一个长时间运行的 Python 脚本导致错误并.py
在脚本运行时更改文件,那么解释器可以根据文件更改的内容报告错误的行作为引发错误.py
。
MWE:
示例.py
from time import sleep
for i in range(10):
print(i)
sleep(1)
raise Exception("foo", "bar")
此脚本运行 10 秒,然后引发异常。
样本2.py
from time import sleep
for i in range(10):
print(i)
sleep(1)
"""
This
is
just
some
filler
to
demonstrate
the
behavior
"""
raise Exception("foo", "bar")
这个文件是相同的,sample.py
只是它在循环结束之间有一些垃圾,并且该行引发了以下异常:
Traceback (most recent call last):
File "sample.py", line 7, in <module>
Exception: ('foo', 'bar')
我做了什么
python3 sample.py
- 在第二个终端窗口中,
mv sample.py sample.py.bak && cp sample2.py sample.py
在sample.py
完成执行之前
预期行为
口译员报告以下内容:
Traceback (most recent call last):
File "sample.py", line 7, in <module>
Exception: ('foo', 'bar')
在这里,解释器报告第 7 行出现异常sample.py
并打印异常。
实际行为
口译员报告以下内容:
Traceback (most recent call last):
File "sample.py", line 7, in <module>
"""
Exception: ('foo', 'bar')
在这里,解释器"""
在报告异常时也会报告。它似乎是在磁盘上的文件中查找这些信息,而不是通过加载到内存中的文件来运行程序。
我的困惑之源
以下是我跑步时发生的事情的心理模型python3 sample.py
:
- 解释器将 的内容加载
sample.py
到内存中 - 解释器进行词法分析、语义分析、代码生成等,产生机器码
- 生成的代码被发送到 CPU 并执行
- 如果出现错误,解释器会查询源代码的内存表示以产生错误消息
显然,我的心智模型存在缺陷。
我想知道的:
- 为什么 Python 解释器会查询磁盘上的文件以生成错误消息,而不是查看内存?
- 我对口译员所做工作的理解是否存在其他缺陷?