4

私はpythonが初めてです。関数に適用すると、いくつかの基準が満たされるまで再試行を続ける再試行デコレーターを作成しようとしています (簡単にするために、10 回再試行するとします)。

def retry():
    def wrapper(func):
        for i in range(0,10):
            try:
                func()
                break
            except:
               continue
    return wrapper

これで、例外が発生した場合に再試行されます。特定の例外で再試行するように変更するにはどうすればよいですか。たとえば、次のように使用したい:

@retry(ValueError, AbcError)
def myfunc():
    //do something

myfunc投げるValueErrorかだけをリトライしたいAbcError

4

3 に答える 3

10

キャッチtupleするブロックに次の例外を指定できます。except ..

from functools import wraps

def retry(*exceptions, **params):
    if not exceptions:
        exceptions = (Exception,)
    tries = params.get('tries', 10)

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kw):
            for i in range(tries):
                try:
                    return func(*args, **kw)
                except exceptions:
                    pass
        return wrapper
    return decorator

キャッチオール*exceptionsパラメーターは常にタプルになります。キーワードも追加したtriesので、再試行回数も設定できます。

@retry(ValueError, TypeError, tries=20)
def foo():
    pass

デモ:

>>> @retry(NameError, tries=3)
... def foo():
...     print 'Futzing the foo!'
...     bar
... 
>>> foo()
Futzing the foo!
Futzing the foo!
Futzing the foo!
于 2013-08-07T11:18:13.473 に答える
1

エラークラスを確認できます:

except Exception as e:
    for et in error_types: #(or args)
        if isinstance(e, et):
            continue
    raise e #re-raise
于 2013-08-07T11:18:35.217 に答える