尝试 - 在循环内部除外

时间:2011-11-09 17:32:44

标签: python

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

下面的代码执行此操作,但它看起来很难看。请帮我把它变得优雅和pythonic。我使用的是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

2 个答案:

答案 0 :(得分:13)

使用try .. except .. else

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

您不应该一般性地捕获所有错误。只需让它们冒泡到适当的处理程序。

答案 1 :(得分:1)

你可以写一个重试装饰器:

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()