Python中異常重試的解決方案詳解

2022-10-03 18:39:08 字數 1784 閱讀 5152

前言

大家在做資料抓取的時候,經常遇到由於網路問題導致的程式儲存,先前只是記錄了錯誤內容,並對錯誤內容進行後期處理。

原先的流程:

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...