2013-08-07 119 views
2

我是新來的蟒蛇。我試圖創建一個重試裝飾器,當應用於一個函數時,它將繼續重試,直到滿足一些條件(爲了簡單起見,重試10次)。我可以將異常作爲參數傳遞給python中的函數嗎?

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

現在,將重試任何異常。我如何改變它,使其重試特定的例外情況。 e.g,我想用它喜歡:

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

我想myfunc將僅重試它拋出ValueErrorAbcError

+0

現在增加了一個'break'。謝謝!。編輯:我認爲這是重試的邏輯錯誤。我只需要'for'循環我認爲 –

回答

8

您可以提供異常的tupleexcept ..塊捕捉:

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! 
+0

其實你可以捕捉到一個「可變異常或你可以捕捉的東西的元組」,但是如果我想得太久,這往往會讓我頭痛。 – Duncan

+0

@Duncan:是的,咖啡因短缺正在影響我的文法中心。 –

+0

@glglgl:它需要的不僅僅是「返回包裝」,這使它成爲一個合適的裝飾工廠。 –

0

您可以檢查錯誤類:

except Exception as e: 
    for et in error_types: #(or args) 
     if isinstance(e, et): 
      continue 
    raise e #re-raise 
+0

除了一個可以迭代的對象(例如元組,列表)以外,所以不需要稍後迭代。 –

2
from functools import wraps 

class retry(object): 
    def __init__(self, *exceptions): 
     self.exceptions = exceptions 

    def __call__(self, f): 
     @wraps(f) # required to save the original context of the wrapped function 
     def wrapped(*args, **kwargs): 
      for i in range(0,10): 
       try: 
        f(*args, **kwargs) 
       except self.exceptions: 
        continue 
     return wrapped 

用法:

@retry(ValueError, Exception) 
def f(): 
    print('In f') 
    raise ValueError 


>>> f() 
In f 
In f 
In f 
In f 
In f 
In f 
In f 
In f 
In f 
In f 
相關問題