Python异常回溯告诉我行结束在哪,开始在哪?

2 投票
2 回答
1540 浏览
提问于 2025-04-11 19:27

当Python代码出现异常时,如果这段代码跨越了多行,比如:

   myfoos = [foo("bar",
                "baz",
                "quux",
                 i) for i in range(10)]

Python会报告最后一行的行号,并显示那一行的代码片段:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    i) for i in range(10)]
NameError: name 'foo' is not defined

有没有办法找出第一行是什么呢?有没有办法捕获这个异常,并处理一下traceback对象,以便能够报告类似这样的内容:

Traceback (most recent call last):
 File "test.py", lines 1-4 in <module>
   myfoos = [foo("bar",
                "baz",
                "quux",
                 i) for i in range(10)]
 NameError: name 'foo' is not defined

相关问题:

2 个回答

0

在一个try/except代码块里,你可以捕捉到NameError这个错误,然后尝试设置NameError.lineno,虽然我不太确定这是否有效或者具体怎么做,但这是我目前找到的最好方法。

try:
    somecode
except NameError
    NameError.lineno = [1,4]

你还得自己想办法找出这个语句是从哪里开始和结束的,以及哪个语句引发了这个错误。

希望这对你有帮助。

3

要找到行的开头其实挺难的。你要么得解析Python代码,要么就得研究一下编译后的字节码。标准库里有一些模块可以用来解析Python代码,但我可以告诉你,从经验来看,理解它们的输出就像是一门黑暗的艺术。而且我也不确定编译后的字节码是否能给出答案……

撰写回答