1、簡介網絡
retry是一個用於錯誤處理的模塊,功能相似try-except,但更加快捷方便,本文就將簡單地介紹一下retry的基本用法。函數
2、基本用法spa
retry:code
做爲裝飾器進行使用,不傳入參數時功能以下例所示:blog
from retry import retry @retry() def demo(): print('錯誤') raise demo()
咱們編寫了每次運行都會經過raise報錯的自定義函數demo(),利用默認參數的retry()進行裝飾,運行結果以下:io
能夠看到,retry()在這裏的功能,是在其裝飾的函數運行報錯後從新運行該函數,在上例中的效果就是反覆運行demo(),這也是retry()的基本用法,下面介紹其幾個主要參數:class
exceptions:傳入指定的錯誤類型,默認爲Exception,即捕獲全部類型的錯誤,也可傳入元組形式的多種指定錯誤類型import
tries:定義捕獲錯誤以後重複運行次數,默認爲-1,即爲無數次exception
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,咱們能夠在譬如網絡爬蟲過程當中更加簡潔靈活地控制錯誤處理過程,使得代碼具備更好的可讀性,以上就是本文的基本內容,若有筆誤,望指出。