前言
大家在做資料抓取的時候,經常遇到由於網路問題導致的程式儲存,先前只是記錄了錯誤內容,並對錯誤內容進行後期處理。
原先的流程:
def crawl_page(url):
pass
def log_error(url):
pass
url = ""
try:
crawl_page(url)
except:
log_error(url)
改進後的流程:
attempts = 0
success = false
while attempts < 3 and not success:
try:
crawl_page(url)
success = true
except:
attempts += 1
if attempts == 3:
break
最近發現的新的解決方案:retrying
retrying是乙個 python的重試包,可以用來自動重試一些可能執行失敗的程式段。retrying提供乙個裝飾器函式retry,被裝飾的函式就會在執行失敗的條件下重新執行,預設只要一直報錯就會不斷重試。
import random
from retrying import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
raiswww.cppcns.come ioerror("broken sauce, everything is hosed!!!111one")
else:
return "awesome sauce!"
print do_something_unreliable()
如果我們執行h**e_a_try函式,那麼直到random.randint返回5,它才會執行結束,程式設計客棧否則會一直重新執行。
retry還可以接受一些引數,這個從原始碼中retrying類的初始化函式可以看到可選的引數:
def retry_if_io_error(exception):
return isinstance(exception, ioerror)
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
with open("file", "r") as f:
return f.read()
在執行read_a_file函式的過程中,如果報出異常,那麼這個異常會以形參exception傳入retry_if_io_error函式中,如果exception是ioerror那麼就進行retry,如果不是就停止執行並丟擲異常。
我們還可以指定要在得到哪些結果的時候去retry,這個要用retry_on_result傳入乙個函式物件:
def retry_if_result_none(result):
return result is none
@retry(retry_on_result=retry_if_result_none)
def get_result():
return none
在執行get_result成功後,會將函式的返回值通過形參result的形式傳入retry_if_result_none函式中,如果返回值是none那麼就進行retry,否則就結束並返回函式值。
總結本文標題: python中異常重試的解決方案詳解
本文位址:
Python中異常重試的解決方案詳解
1 2345 67defretry if io error exception returnisinstance exception,ioerror retry retry on exception retry if io error defread a file withopen file r a...
Python的異常重試方法
專案msb服務不穩定,通過python建立websocket總是會有問題,很不穩定,但是一般來說重新建立連線就能成功,多嘗試幾次就好了。既然有了相應的需求,就要考慮如何去解決這個websocket建立異常重試的問題 原來的 只建立了一次websocket連線 ws.connect url,heade...
python中的重試
安裝 pip install retrying retry 裝飾器會對函式不斷的重試 預設無限重試 retry def pick one print pick t random.randint 0,2 print t if t 1 raise exception 1 is not picked if...