4

我有下面的代码,所以当任何异常发生时,重新做这个循环,而不是跳到下一个循环。请注意这里的伪代码确实按预期工作:

for cl in range(0, 10):
    try:
        some_function(cl)
    except :
        cl -= 1

我的倡议是一旦出了问题,就再做一次。显然,这不是一个可行的想法。所以假设for循环和range function被使用,如何实现我描述的控制?

谢谢

4

3 回答 3

6

您只需要在第一个循环中继续尝试该函数,直到它起作用:

for cl in range(0, 10):
    while True:
        try:
            some_function(cl)
        except Exception:
            continue    # try it again
        else:
            break       # exit inner loop, continue to next c1
于 2012-12-13T23:20:03.187 回答
4

为了更好地控制循环变量,您可能需要使用while循环:

cl = 0
while cl < 10:
    try:
        some_function(cl)
        cl += 1
    except:
        pass

在 Python 中,该pass语句是一个“什么都不做”的占位符。如果出现异常,cl将再次尝试相同的值。

当然,您还需要添加一些机制,如果您总是遇到异常,您可以退出循环。

于 2012-12-13T23:18:29.613 回答
2

因为我对循环有病态的仇恨while True,所以我建议简化@kindall 的答案:首先,改变some_function()它以使其False在失败时返回而不是抛出异常。然后,使用以下循环:

for cl in range(0, 10):
    while not some_function(cl): pass

如果您不能(或不想) change some_function(),您可以添加一个包装器:

def exceptionless_function(arg):
    try:
        some_function(arg)
        return True
    except <known exceptions>:
        return False

编辑:我在<known exceptions>上面添加以表明except应避免使用不合格条款。如果您不知道实际希望捕获哪些类型的异常,那么在某些情况下,简单地再次调用该函数几乎肯定是错误的行为。例如,OP 提到(在评论中)如果在重试此功能时发生超时,将会有“警报”。如果该警报碰巧以某种异常的形式出现,那么在“包罗万象”的情况下,它将被简单地忽略!

于 2012-12-13T23:28:00.393 回答