循环中的try-except

13 投票
2 回答
69301 浏览
提问于 2025-04-17 05:58

我需要调用一个叫做 f 的方法。如果这个方法抛出一个 IOError 错误,我需要再调用它一次(重试),最多重试三次。如果出现其他错误,我需要记录这些错误,并且要记录所有的重试情况。

下面的代码实现了这个功能,但看起来很丑陋。请帮我把它变得优雅一些,更符合 Python 的风格。我正在使用 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 个回答

3

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

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

使用 try .. except .. else

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

不要随便捕捉所有错误。让错误自然地传递到合适的处理程序那里去。

撰写回答