如果发生异常,如何重试嵌套的for循环?

时间:2019-02-28 18:32:59

标签: python python-requests

发生异常时,它将跳过当前的“ y”。我无法阻止这种情况。

  for x in range(1, 100):
            for y in range(1, 100):
                try:
                    text = requests.post(url, {"x":a, "y":b})
                except:
                    time.sleep(10)

使用True时解决,但现在它不会中断第一个循环

2 个答案:

答案 0 :(得分:1)

您可以将try / except块包装成一个循环,并在break块的末尾包含一个try语句。您的程序将继续尝试发出发布请求,直到成功并到达break。如果requests.post遇到异常,程序将跳过break并移至except块,等待,然后重试。

例如:

for x in range(1, 100):
    for y in range(1, 100):
        while True:
            try:
                text = requests.post(url, {"x":a, "y":b})
                break
            except:
                time.sleep(10)

修改

由于您提到对于每个x,程序应尝试每个y,直到找到正确的y,此时程序应跳至下一个x ,我已添加此更新。为此,您可以保留一个变量以跟踪是否已找到正确的y。然后,在尝试每个y之后,您可以检查该变量(found_correct_y)的值,如果它的值是True,则跳出for y in ...循环并继续x的下一个值。

这是一个例子:

for x in range(1, 100):
    found_correct_y = False
    for y in range(1, 100):
        while True:
            try:
                response = requests.post(url, {"x":a, "y":b})
                found_correct_y = was_correct_y(response)
                break # out of the 'while True' loop
            except: 
                time.sleep(10)
        if found_correct_y:
            break # out of the 'for y ...' loop, to the next x


def was_correct_y(response):
    """returns a boolean based on some properties of the response"""
    pass

答案 1 :(得分:1)

我在内部的'y'块中引发了一个异常,但仍然成功,即循环回到'x'块。

for x in range(1, 10):
            for y in range(1, 10):
                try:
                    #text = requests.post(url, {"x":a, "y":b})
                    print('y',y,'x',x)
                    if (x==2):
                        raise
                except:
                    time.sleep(10)