假设我有一个异常,每次运行它时,它都会(不可预测/不一致地(在脚本的不同行引发。我如何以这样的方式处理此异常:(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()