【问题标题】:Can I make Python tell me on exactly which character causes an error?我可以让 Python 准确地告诉我哪个字符会导致错误吗?
【发布时间】:2018-06-10 07:05:43
【问题描述】:

Python 的错误只显示发生在哪一行错误。

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

Traceback (most recent call last):
  File "/Users/clickbait/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/clickbait/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 错误显示引发异常的列/字符以及行号?


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

【问题讨论】:

  • 编译器不保留列信息,只保留行信息。
  • 你的代码被标记化,然后变成一个抽象语法树,然后那个树被编译成字节码。到出现运行时错误时,只保留行号,而不是子表达式的确切字符位置。
  • 如果您发现在一行上调试列表解析太麻烦,您可以使用append() 将列表解析拆分为for 循环。
  • 这些 cmets 应该是答案,因为它们完全回答了问题。
  • 这也没什么大不了的。在大多数情况下,包括在这种情况下,只有很多地方可能会出错。如果你

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


【解决方案1】:

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

查看我的演讲 Where am I now really? 或视频 here

【讨论】:

    【解决方案2】:

    许多运行时系统会同时返回错误和违规值,但 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
    

    【讨论】:

      【解决方案3】:

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

      如果此错误难以调试,您可以轻松地将表达式拆分为 for 循环并附加列表:

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

      我发现使用 Python 调试器来单步调试代码很容易。

      【讨论】:

        猜你喜欢
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 2012-09-16
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多