【问题标题】:How to retry nested for loop if exception occurs? [duplicate]如果发生异常,如何重试嵌套的for循环? [复制]
【发布时间】:2019-07-22 17:56:50
【问题描述】:

当发生异常时,它会跳过当前的“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)

用 while True 解决,但现在它不会破坏第一个循环

【问题讨论】:

  • 使其成为一个函数,并让异常再次调用该函数。
  • @tgikal 重新启动进程,这不是我想要的

标签: python python-requests


【解决方案1】:

您可以将try/except 块包装在一个循环中,并在try 块的末尾包含一个break 语句。您的程序将继续尝试发出 post 请求,直到它成功并到达 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

【讨论】:

  • 它解决了问题,但现在它没有打破第一个循环并继续尝试相同的 x
  • @kusky 你能解释一下吗?如果抛出异常,您是否希望它使用不同的 x 重试?
  • 对于每个 x,它会尝试所有 100 个 y,但如果找到正确的 y,它应该转到下一个 x
  • @kusky 进行了编辑,如果有帮助请告诉我
  • name 'response' 未定义,for 循环中有很多代码我失去了理智。我接受了答案,因为它似乎可以工作
【解决方案2】:

我在内部 '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)

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多