当跨越多行的代码抛出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
答案 0 :(得分:2)
找到该行的开头将非常困难。你必须要么解析Python,要么深入研究编译后的字节码。标准库中有用于解析Python的模块,但我可以从经验中告诉你,解释它们的输出是一种黑色艺术。而且我不确定编译的字节代码是否有答案......
答案 1 :(得分:0)
在try / except块中,除了NameError之外你可以尝试设置NameError.lineno,虽然我不确定它是否或如何工作,但它是我发现的最好的。
try:
somecode
except NameError
NameError.lineno = [1,4]
您必须弄清楚语句的开始和结束位置,以及哪种语句引发错误。
希望这有帮助