Python:如何在使用';对于';环

Python:如何在使用';对于';环,python,for-loop,Python,For Loop,我得到了下面的一段代码,因此当出现任何异常时,重新执行这个循环,而不是跳到下一个循环。请注意,此处的伪代码确实按预期工作: for cl in range(0, 10): try: some_function(cl) except : cl -= 1 我的倡议是,一旦出了问题,再做一次。显然,这不是一个可行的想法。因此,假设使用了for循环和范围函数,如何实现我描述的控制 感谢对循环变量的更多控制,您可能希望在循环时使用: cl = 0 whil

我得到了下面的一段代码,因此当出现任何异常时,重新执行这个循环,而不是跳到下一个循环。请注意,此处的伪代码确实按预期工作:

for cl in range(0, 10):
    try:
        some_function(cl)
    except :
        cl -= 1
我的倡议是,一旦出了问题,再做一次。显然,这不是一个可行的想法。因此,假设使用了
for
循环和
范围函数
,如何实现我描述的控制


感谢

对循环变量的更多控制,您可能希望在循环时使用

cl = 0
while cl < 10:
    try:
        some_function(cl)
        cl += 1
    except:
        pass
cl=0
cl<10时:
尝试:
某些函数(cl)
cl+=1
除:
通过
在Python中,
pass
语句是一个“不做任何事情”的占位符。在获得异常的情况下,将再次尝试相同的
cl


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

您只需在第一个循环中添加第二个循环,即可继续尝试该函数,直到它工作:

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

因为我有一种病态的憎恨
而True
循环,我建议对@kindall的答案进行简化:首先,更改
某些函数()
,使其在失败时返回
False
,而不是抛出异常。然后,使用以下循环:

for cl in range(0, 10):
    while not some_function(cl): pass
如果您不能(或不想)更改
某些函数()
,则可以添加包装器:

def exceptionless_function(arg):
    try:
        some_function(arg)
        return True
    except <known exceptions>:
        return False
def无例外_函数(arg):
尝试:
某些函数(arg)
返回真值
除:
返回错误

编辑:我在上面添加了
,以表明应避免使用不合格的
除外
子句。如果您不知道实际需要捕获哪些类型的异常,那么在某些情况下,简单地再次调用函数几乎肯定是错误的行为。例如,OP(在注释中)提到,如果在重试此函数时发生超时,将出现“警报”。如果该警报碰巧以某种异常的形式出现,那么在“一网打尽”的情况下它将被忽略

我知道这是演示代码,但您也应该鼓励捕获特定的异常类型。除此之外,这是一个好帖子。@ThaneBrimhall:这是一个很好的观点。使用
捕获所有异常,除了:
会使使用Ctrl+C退出程序变得困难。@GregHewgill:Nope,
键盘中断
,因为它直接继承自
BaseException
。@TimPietzcker:很高兴知道,谢谢。我知道我以前遇到过这个问题,但一定是因为不同的原因。你确定
某个函数()
最终会成功吗?因为否则,您将有一个无限循环。@KyleStrand不,不确定。但是在这段代码之外,有一个计时器可以频繁地ping一个警报程序,一旦它在一段超时时间内没有被ping,它就会发出警报。为了简单起见,我没有提到。但还是要感谢你指出这一点。这是一个非常糟糕的迹象,你在一个范围内迭代。你是真的想要数字,还是用数字作为索引,如果是后者,就不是Pythonic,还有更好的方法。类似地,
except
只能在特定的异常情况下使用,否则您可能会捕捉到您不想捕捉的东西并隐藏错误。我更喜欢这种方法,因为它也适用于直接在一系列对象上迭代的“真实”Python
。同意。此外,如果在失败时,
some_function()
仅仅返回
False
而不是抛出异常,那么您可以简化此代码,并将
while True:
替换为
while True:
行,而不是some_function(cl):pass
@kindall出于好奇,使用“else”关键字是否多余?为什么不直接中断呢?我喜欢显式的,但是在函数调用之后,您确实可以在
try/except
之后中断,甚至可以在
try
块本身内部中断。我相信在这种情况下它不是多余的,但是如果
except
子句没有强制执行
continue
,它就不会是多余的。