Python 尝试在循环内进行

Python 尝试在循环内进行,python,Python,我需要调用方法f。如果它引发一个IOError,我需要再次调用它(重试),最多调用三次。我需要记录任何其他异常,我需要记录所有重试 下面的代码可以做到这一点,但看起来很难看。请帮我把它弄得优雅,像蟒蛇一样。我正在使用Python 2.7 谢谢 count = 3 while count > 0: try: f() except IOError: count -= 1 if count > 0: p

我需要调用方法
f
。如果它引发一个
IOError
,我需要再次调用它(重试),最多调用三次。我需要记录任何其他异常,我需要记录所有重试

下面的代码可以做到这一点,但看起来很难看。请帮我把它弄得优雅,像蟒蛇一样。我正在使用Python 2.7

谢谢

count = 3
while count > 0:
    try:
        f()
    except IOError:
        count -= 1
        if count > 0:
            print 'retry'
        continue
    except Exception as x:
        print x
    break

使用
try。。除了否则

for i in range(3, 0, -1):
  try:
    f()
  except IOError:
    if i == 1:
      raise
    print('retry')
  else:
    break

您不应该笼统地捕获所有错误。只需让它们冒泡到相应的处理程序。

您可以编写一个重试修饰符:

import time

def retry(times=3, interval=3):
    def wrapper(func):
        def wrapper(*arg, **kwarg):
            for i in range(times):
                try:
                    return func(*arg, **kwarg)
                except:
                    time.sleep(interval)
                    continue
            raise
        return wrapper
    return wrapper


//usage
@retry()
def fun():
    import inspect; print inspect.stack()[0][3]
    return "result"

print fun()

您可能希望在最后一次尝试时重新引发
IOError
,以便程序以实际异常结束(并且没有关于未发生重试的注释)。谢谢。“else”子句很有用,但我需要记录所有异常,所以我也必须捕获其他异常。是的,我把它们记录下来后又冷起来了。@poke-Oops,完全忘了。更新。@akonsu如果要捕获所有异常,只需省去
IOError
或用
BaseException
替换即可。