<分区>
当 Python 解释器报告错误/异常时(从现在开始我只是说“错误”来指代这两者),它会打印导致错误的行号和内容。
有趣的是,如果你有一个长时间运行的 Python 脚本导致错误并在脚本运行时更改 .py
文件,那么解释器可以报告错误行作为引发错误,基于 .py
文件的更改内容。
MWE:
示例.py
from time import sleep
for i in range(10):
print(i)
sleep(1)
raise Exception("foo", "bar")
此脚本运行 10 秒,然后引发异常。
sample2.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
beforesample.py
完成执行
预期行为
解释器报告如下:
Traceback (most recent call last):
File "sample.py", line 7, in <module>
Exception: ('foo', 'bar')
此处,解释器报告在 sample.py
的第 7 行出现异常并打印异常。
实际行为
解释器报告如下:
Traceback (most recent call last):
File "sample.py", line 7, in <module>
"""
Exception: ('foo', 'bar')
这里,解释器在报告异常的时候也会报告"""
。
它似乎是在磁盘上的文件中寻找这些信息,而不是加载到内存中的文件来运行程序。
我困惑的根源
以下是我运行 python3 sample.py
时发生的事情的心智模型:
- 解释器加载
sample.py
的内容到内存 - 解释器进行词法分析、语义分析、代码生成等,产生机器码
- 生成的代码被发送到CPU并执行
- 如果出现错误,解释器会引用源代码的内存表示以生成错误消息
显然,我的心智模型存在缺陷。
我想知道的:
- 为什么 Python 解释器会引用磁盘上的文件来生成错误消息,而不是在内存中查找?
- 我对解释器所做工作的理解是否存在其他缺陷?