异常处理 - 睡眠,然后重试产生错误的同一行



假设我有一个异常,每次运行它时,它都会(不可预测/不一致地(在脚本的不同行引发。我如何以这样的方式处理此异常:(1( 在错误后强制脚本休眠几秒钟,然后 (2( 尝试重新执行导致错误的同一行代码,希望第二次(或第 3 次,或第 4 次......(获得成功的结果,以及 (3( 不重新执行脚本中导致该点的所有行?换句话说,我希望它"转到"上一行并重试直到成功,尽管对避免无限循环的尝试次数有上限。

下面的代码是我问题的概念示例。所需的结果将打印:

一个BCDE

而是打印类似以下内容:

一个一个B一个B一个一个一个一个B一个一个一个BCDE

import time, random
success, attempts = False, 0
while success == False and attempts <= 20:
    try:
        x, y = 1, random.choice([0,1])
        x/y
        print "A"
        x, y = 1, random.choice([0,1])
        x/y
        print "B"
        x, y = 1, random.choice([0,1])
        x/y
        print "C"
        x, y = 1, random.choice([0,1])
        x/y
        print "D"
        x, y = 1, random.choice([0,1])
        x/y
        print "E"
        success = True
    except ZeroDivisionError:
        attempts += 1
        time.sleep(3)

提前谢谢。

您可以使用条件和显式跟踪的待办事项列表来伪造一组 goto。每次任务成功时,请将其从待办事项列表中删除,这样您就不会再次尝试。

import time, random
attempts = 0
# Reverse order because it's more efficient to remove an item
# from the end of a list than the beginning. Use a deque
# if this bothers you.
to_do = ["E", "D", "C", "B", "A"]
while to_do and attempts <= 20:
    try:
        if to_do[-1] == "A":
            x, y = 1, random.choice([0,1])
            x/y
            print "A"
            to_do.pop()
        elif to_do[-1] == "B": 
            x, y = 1, random.choice([0,1])
            x/y
            print "B"
            to_do.pop()
        elif to_do[-1] == "C":
            x, y = 1, random.choice([0,1])
            x/y
            print "C"
            to_do.pop()
        elif to_do[-1] == "D":
            x, y = 1, random.choice([0,1])
            x/y
            print "D"
            to_do.pop()
        elif to_do[-1] == "E":
            x, y = 1, random.choice([0,1])
            x/y
            print "E"
            to_do.pop()
    except ZeroDivisionError:
        attempts += 1
        time.sleep(3)

但是,通过为每个任务定义一个单独的函数,并使用函数本身的存在,可以显着清理这一点。以指示它仍需要运行failures

to_do = [task_e, task_d, task_c, task_b, task_a]
while attempts <= 20:
    while to_do:
        try:
            to_do[-1]()
        except ZeroDivisionError:
            attempts += 1
            time.sleep(3)
        else:
            to_do.pop()

最新更新