一、簡介
retry是一個用於錯誤處理的模塊,功能類似try-except,但更加快捷方便,本文就將簡單地介紹一下retry的基本用法。
二、基本用法
retry:
作為裝飾器進行使用,不傳入參數時功能如下例所示:
from retry import retry @retry() def demo(): print('錯誤') raise demo()
我們編寫了每次運行都會通過raise報錯的自定義函數demo(),利用默認參數的retry()進行裝飾,運行結果如下:

可以看到,retry()在這里的功能,是在其裝飾的函數運行報錯后重新運行該函數,在上例中的效果就是反復運行demo(),這也是retry()的基本用法,下面介紹其幾個主要參數:
exceptions:傳入指定的錯誤類型,默認為Exception,即捕獲所有類型的錯誤,也可傳入元組形式的多種指定錯誤類型
tries:定義捕獲錯誤之后重復運行次數,默認為-1,即為無數次
delay:定義每次重復運行之間的停頓時長,單位秒,默認為0,即無停頓
backoff:呈指數增長的每次重復運行之間的停頓時長,需要配合delay來使用,譬如delay設置為3,backoff設置為2,則第一次間隔為3*2**0=1秒,第二次3*2**1=2秒,第三次3*2**2=4秒,以此類推,默認為1
max_delay:定義backoff和delay配合下出現的等待時間上限,當delay*backoff**n大於max_delay時,等待間隔固定為該值而不再增長
下面我們通過幾個直觀的例子來更加深刻地認識上述參數:
import time from retry import retry '''記錄初始時刻''' start_time = time.clock() @retry(delay=1,tries=4,backoff=2) def demo(start_time): '''將當前時刻與初始時刻的時間差(單位:S)作差並四舍五入''' print(round(time.clock()-start_time,0)) raise demo(start_time)
在上例中,我們設置delay為1,tries為4,backoff為2,通過我們的自定義函數來記錄每次重復運行與初始時刻的時間差,這樣第一次與第二次間隔時間為1*2**0=1,第二次與第三次間隔為1*2**1=2,第三次與第四次間隔4,運行結果如下,到達預定的運行狀況后程序就會報錯從而終止運行:

符合我們上面的計算結果,下面我們設置一個較小的max_delay:
import time from retry import retry '''記錄初始時刻''' start_time = time.clock() @retry(delay=1,tries=10,backoff=2,max_delay=20) def demo(start_time): '''將當前時刻與初始時刻的時間差(單位:S)作差並四舍五入''' print(round(time.clock()-start_time,0)) raise demo(start_time)
運行結果如下:

可以看到,在delay和backoff共同控制下的間隔時長超過20秒后,之后的每一次間隔時長都固定為20秒,直到所有的tries運行結束。
利用retry,我們可以在譬如網絡爬蟲過程中更加簡潔靈活地控制錯誤處理過程,使得代碼具有更好的可讀性,以上就是本文的基本內容,如有筆誤,望指出。
