我可以让Python告诉我究竟哪个字符导致错误吗?

时间:2017-12-29 23:08:33

标签: python python-3.x exception error-handling runtime-error

Python的错误只显示发生的行错误。

运行时错误的示例,其中知道行中的哪个位置导致错误将节省时间:

Traceback (most recent call last):
  File "/Users/William Qin/Projects/Python Projects/detail-processing.py", line 34, in <module>
    samples = [oldMatrix[x + pixel[0], y + pixel[1]][2] for pixel in pixelsToSample]
IndexError: image index out of range

如果错误还显示哪个列或字符导致错误,那将会很有用。就像在示例中一样,如果错误指向问题所在的位置,我就不需要检查所有3个列表索引。

另一个运行时错误,其中知道行中的哪个位置导致错误将节省时间:

Traceback (most recent call last):
  File "/Users/williamqin/Projects/stackpromo/main.py", line 482, in get
    postSlogan=tagLines[int(randomAd.tagLine)][JSON['post_type']].format(site=adSiteNames[randomAd.site]),
TypeError: string indices must be integers, not unicode

此行有很多内容([xxx])。我想知道哪个索引导致问题!

是否有设置(可能是命令行标志)使Python错误显示列/字符以及引发异常的行号?

语法错误指向带有^符号的无效语法,但运行时错误并不指向导致错误的变量。

3 个答案:

答案 0 :(得分:4)

不,没有这样的选择。 Python编译器在标记和解析源代码时不保留列位置。在生成的字节码中只保留行号。

如果这个bug难以调试,你可以将你的表达式简单地拆分成一个for循环并附加列表:

samples = []
for pixel in pixelsToSample:
    a = x + pixel[0]
    b = y + pixel[1]
    m = oldMatrix[a, b]
    samples.append(m[2])

我发现只需使用Python调试器来逐步完成代码就足够了。

答案 1 :(得分:1)

许多运行时系统都会返回错误和违规值,但Python不在其中。实现代码有很多层;返回对象和索引,以及将对象转换回运行时表达式的字符串,更有效。它在某种程度上拓宽了错误处理界面,并且在执行时耗费了更多时间。

在大多数情况下,追踪问题也很容易。将此行拆分为各个步骤并再次运行程序,以查看错误所在:

# samples = [oldMatrix[x + pixel[0], y + pixel[1]][2] for pixel in pixelsToSample]
dummy = []
for pixel in pixelsToSample:
    print pixel
    newx = x + pixel[0]
    newy = y + pixel[1]
    print oldMatrix[newx, newy]
    dummy.append(oldMatrix[newx, newy][2])
print dummy

答案 2 :(得分:1)

实际上,在许多情况下,可以通过使用将字节码偏移映射到解析片段的反编译器来更好地解决错误所在。

请参阅我的演讲 Where am I now really? 或该 here 的视频。