Python中異常重試解決方案

2021-02-06 編程派

原文:https://www.biaodianfu.com/python-error-retry.html

作者:標點符

全文約 2600 字,讀完可能需要 4 分鐘。

在做數據抓取的時候,經常遇到由於網絡問題導致的程序保存,先前只是記錄了錯誤內容,並對錯誤內容進行後期處理。

原先的流程:

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:

        raise IOError("Broken sauce, everything is hosed!!!111one")

    else:

        return "Awesome sauce!"

 

print do_something_unreliable()

如果我們運行 haveatry 函數,那麼直到 random.randint 返回 5,它才會執行結束,否則會一直重新執行。 
retry 還可以接受一些參數,這個從源碼中 Retrying 類的初始化函數可以看到可選的參數:

stopmaxattempt_number:用來設定最大的嘗試次數,超過該次數就停止重試

 stopmaxdelay:比如設置成 10000,那麼從被裝飾的函數開始執行的時間點開始,到函數成功運行結束或者失敗報錯中止的時間點,只要這段時間超過 10 秒,函數就不會再執行了

wait_fixed:設置在兩次 retrying 之間的停留時間

waitrandommin 和 waitrandommax:用隨機的方式產生兩次 retrying 之間的停留時間

waitexponentialmultiplier 和 waitexponentialmax:以指數的形式產生兩次 retrying 之間的停留時間,產生的值為 2^previousattemptnumber * waitexponentialmultiplier,previousattemptnumber 是前面已經 retry 的次數,如果產生的這個值超過了 waitexponentialmax 的大小,那麼之後兩個 retrying 之間的停留值都為 waitexponentialmax。這個設計迎合了 exponential backoff 算法,可以減輕阻塞的情況。

我們可以指定要在出現哪些異常的時候再去 retry,這個要用 retryonexception 傳入一個函數對象:

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()

在執行 readafile 函數的過程中,如果報出異常,那麼這個異常會以形參 exception 傳入 retryifio_error 函數中,如果 exception 是 IOError 那麼就進行 retry,如果不是就停止運行並拋出異常。

我們還可以指定要在得到哪些結果的時候去 retry,這個要用 retryonresult 傳入一個函數對象:

def retry_if_result_none(result):

    return result is None

 

@retry(retry_on_result=retry_if_result_none)

def get_result():

    return None

在執行 getresult 成功後,會將函數的返回值通過形參 result 的形式傳入 retryifresultnone 函數中,如果返回值是 None 那麼就進行 retry,否則就結束並返回函數值。

其他相關資料:

題圖:pexels,CC0 授權。

點擊閱讀原文,查看更多 Python 教程和資源。

相關焦點

  • Python退避及重試裝飾器:backoff
    示例由於Kenneth Reitz的requests模塊已經成為Python中同步HTTP客戶端的行業標準,因此下面使用該模塊編寫了網絡示例,但是backoff模塊根本不需要它。@backoff.on_exception當指定異常被引發時,使用on_exception裝飾器重試。
  • Python錯誤重試方法
    使用首先安裝Tenacitypip install Tenacity無限重試第一個重試案例,因為一直是拋出異常錯誤,所以無限進行重試執行from tenacity import retry@retry()def test_retry(): print('失敗重試中') raise Exception test_retry
  • 重試機制!java retry(重試) spring retry, guava retrying 詳解
    這個問題你要解決一下。小明:好的。(誰?如果需要重試,我們可能需要等一段時間(可能伺服器過於繁忙,如果一直不間隔重試可能拖垮伺服器),當然這段時間可以是 0,也可以是固定的,可以是隨機的(參見tcp的擁塞控制算法中的回退策略)。
  • Nginx 失敗重試機制
    可直接點擊上方藍字(網易遊戲運維平臺) 關注我們,獲一手遊戲運維方案背景 Nginx 作為目前應用較廣的反向代理服務,原生提供了一套失敗重試機制,來保證服務的可用性。本文主要是通過一些簡單例子來剖析 Nginx 失敗重試機制,讓讀者能對該機制有一個基礎的了解,避免在使用過程中踩坑。
  • Python異常處理
    問題描述大家在使用python語言寫代碼的時候難免會出一些錯誤,而才入門的朋友們往往不知道是哪裡出了錯或者不知道自己錯在哪裡、什麼錯誤。所以我們要知道是哪行代碼出錯,其次室錯誤的類型是什麼,錯在那個細節,逐步分析,從而解決錯誤並改正。
  • python入門——Python中異常處理
    python大數據課堂已經開始了。想轉行大數據,數據挖掘,機器學習,人工智慧的小夥伴可以關注啦。上一篇帶大家了解了python中的I/O函數。今天我們來繼續了解python中的異常處理。調試環境以python3.6環境為例。需要代碼和demo的朋友可以搜索「欒鵬全棧」到我的CSDN博客。
  • 16-python中的異常
    通過前兩天的文章14-python中的函數,15-再敘python中的函數我們對python中有關函數的知識有了系統的認識和學習,今天我們將接著來看一下python中的異常。(一)Bug的由來和分類    "Bug"一詞的原意是"昆蟲"或"蟲子";而在電腦系統或程序中隱藏著的一些未被發現的缺陷或問題,人們也叫它"bug"。
  • 一文教你讀懂 Python 中的異常信息
    雖然 Python 的 Traceback 提示信息看著挺複雜,但是裡面豐富的信息,可以幫助你診斷和修復代碼中引發異常的原因,以及定位到具體哪個文件的哪行代碼出現的錯誤,所以說學會看懂 Traceback 信息是非常重要的,另外在面試的時候也經常會問到 Python 中的異常類型及其含義,那麼,接下來就讓我們對其進行詳細理解。
  • python中的異常捕獲
    無論是編程新手還是老手,都會遇到過程序報錯,終止執行的情況,對於python的報錯信息,可以分為以下兩大類語法錯誤,syntax error
  • RocketMQ消息發送常見錯誤與解決方案
    在RocketMQ中通常遇到網絡超時,通常與網絡的抖動有關係,但由於我對網絡不是特別擅長,故暫時無法找到直接證據,但能找到一些間接證據,例如在一個應用中同時連接了kafka、RocketMQ集群,發現在出現超時的同一時間發現連接到RocketMQ集群內所有Broker,連接到kafka集群都出現了超時。但出現網絡超時,我們總得解決,那有什麼解決方案嗎?
  • 分布式事務,EventBus 解決方案:CAP【中文文檔】
    1.2 應用場景CAP 的應用場景主要有以下兩個:分布式事務中的最終一致性(異步確保)的方案。分布式事務是在分布式系統中不可避免的一個硬性需求,而目前的分布式事務的解決方案也無外乎就那麼幾種,在了解 CAP 的分布式事務方案前,可以閱讀以下 這篇文章。
  • python基礎---異常處理
    程序的異常處理今天霖小白心血來潮想來分享一下python基礎中的如何異常處理,使程序有更好的用戶體驗。前言python程序對用戶的輸入有一定的要求,所以當實際輸入不滿足程序要求時,可能在程序運行過程中會直接報錯無法進行下一步的運行。
  • 令人窒息的python騷操作
    本文用作記錄,在使用python過程中遇到的一些技巧,有些代碼是本人所寫,有些則是python內置函數,有些則取之網際網路。
  • 如何正確解決Python中的中文編碼問題?
    這種異常在Python中很容易遇到,尤其是在Python2.x中,是一個很讓初學者費解頭疼的問題。不過,如果你理解了Python的Unicode,並在編碼中遵循一定的原則,這種編碼問題還是比較容易理解和解決的。
  • 未雨綢繆-Python異常
    Exception: hyperdrive overload在第一個示例(raise Exception)中,引發的是通用異常,沒有指出出現了什麼錯誤。在第二個示例中,添加了錯誤消息hyperdrive overload。2.2 自定義異常類雖然內置異常涉及的範圍很廣,能夠滿足很多需求,但有時在業務中需要創建業務相關的異常類。
  • 暴雪戰網重試次數過多,請稍後重試的解決辦法
    最近時間較多就玩起了暴雪的遊戲,可這幾天我也碰到了這種情況,上午玩了一個多小時守望先鋒,中午吃個飯回來就登陸不上去了,提示重試次數過多,請稍後再試。然後就在網上搜了一下,原因大概是清楚了:出在了寬帶上,而且用的應該是長城寬帶。我測試網速顯示100M帶寬,但是有一個細節,偶爾是聯通網絡通信最佳,偶爾又是行動網路通信最佳。
  • 如何選擇分布式事務解決方案?
    阿里妹導讀:分布式事務中涉及的參與者分布在異步網絡中,參與者通過網絡通信來達到分布式一致性,網絡通信不可避免出現失敗、超時的情況,因此分布式事務的實現比本地事務面臨更多的困難。本文歸納總結五種分布式事務解決方案,並剖析其特點。較長,同學們可收藏後再看。文末福利:Java 程式設計師學習清單。
  • Python 裝飾器填坑指南 | 最常見的報錯信息、原因和解決方案
    在 Python 中,裝飾器屬於純粹的「語法糖」,不使用也沒關係,但是使用的話能夠大大簡化代碼,使代碼更加簡潔易讀。最近在霍格沃茲測試學院的《Python 測試開發實戰進階》課程中學習了 App 自動化測試框架的異常處理,存在一定重複代碼,正好可以當作題材,拿來練習一下裝飾器。
  • 頁面顯示「網絡加載異常,點擊重試」
    今日下午 3 點左右,部分網友在微博反映稱自己的滴滴出行APP出現了宕機的情況,頁面顯示「網絡加載異常,點擊重試」。昨日,滴滴表示,國慶節啟程高峰將出現在 9 月 30 日,將成為年內最難打車日,預計打車成功率不足60%。對此,滴滴網約車將於 9 月 30 日當日和快的新出租、花小豬聯手發放 1 億司機補貼,提升打車成功率。
  • python os.listdir()亂碼解決方案
    /usr/bin/python# -*- coding: UTF-8 -*-import os, sys# 打開文件path = "/var/www/html/"dirs = os.listdir( path )# 輸出所有文件和文件夾for file in dirs:  print(file