【问题标题】:why is my try- except block stuck in the loop?为什么我的 try-except 块卡在循环中?
【发布时间】:2019-02-21 14:58:59
【问题描述】:

我正在尝试使用以下 try 和 except 块来捕获 Index out of range 错误。

def getStepList(r, h, d):
    x = len(r)-1
    y = len(h)-1
    list = []
    while True:
        try:
            if x == 0 and y == 0: 
                break
            elif x >= 1 and y >= 1 and d[x][y] == d[x-1][y-1] and r[x-1] == h[y-1]:
                x = x - 1
                y = y - 1
            elif y >= 1 and d[x][y] == d[x][y-1]+1:
                #insertion
                x = x
                y = y - 1
                list.append(h[y])
                print('insertion')

            elif x >= 1 and y >= 1 and d[x][y] == d[x-1][y-1]+1:
                #substitution
                x = x - 1
                y = y - 1
                list.append(r[x])
                print('substitution')

            else:
                #deletion
                x = x - 1
                y = y
                list.append(r[x])
                print('deletion')

        except IndexError:
            print('index error')

    return list[::-1]

但它陷入了无限循环。我希望它忽略它并继续附加下一个实例。 (作为参考,它的一段代码使用另一个函数的度量来确定在每个操作中插入、替换或删除了哪些单词)。

我觉得我应该知道这一点,但老实说我被困住了。

【问题讨论】:

  • 如果您有IndexError,则表明您已到达循环的末尾。你可以在except IndexError:中拥有break
  • 您是否打印了xy 以查看它们是否变成0
  • 因为异常中的循环没有终止条件。当它遇到异常时,它会移动到异常部分,然后移动到循环的下一次迭代。您可能想在除了部分之外放置一个中断条件。
  • 首先,重新提出您捕获的错误而不是忽略(除了打印通用消息),以便您知道是什么导致了错误。不过,一般来说,尽量在 try 块中保留尽可能少的代码,以减少预期错误的可能来源。
  • 这种方法根本上是不健全的。不要捕获超出范围的错误。通过修复代码防止它们:这些错误不会在正确的程序中发生。它们发生是因为您的逻辑有误。无限循环只是这个潜在问题的一个症状(因为在发生错误的情况下,您没有提供更新索引的逻辑)。

标签: python try-except


【解决方案1】:

不要做一会儿真的。将您的 while 条件更改为:

while(not (x == 0 and y == 0)):

在你的异常中也添加一个中断

except IndexError:
     print('index error')
     break

您还可以添加一些检查以查看具体的索引错误可能是什么:

d_len = len(d)
r_len = len(r)
h_len = len(h)
d_x_of_y_len = len(d[x][y])
if(x > d_len):
    print("x is too big")
if(y > d_x_of_y_len):
    print("y is too big")

【讨论】:

  • while x != 0 or y != 0:
  • 这是一个很好的、不相关的建议,但它从根本上不能解决 OP 的问题。
  • 顺便说一句,感谢您的调试建议,有人向我提供了错误的数据,所以我也设法解决了这个问题。
猜你喜欢
  • 2022-11-02
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多