Python3,异常进阶写法之retrying。
異常進階寫法
- 1、引言
- 2、異常進階寫法
- 2.1 普通寫法
- 2.1.1 追加日志定位異常
- 2.1.2 增加重試機制
- 2.2 進階寫法
- 2.2.1 安裝
- 2.2.1 裝飾器retry使用
- 2.2.2 添加最大次數限制
- 2.2.3 添加最長重試時間
- 2.2.4 設置固定重試時間
- 2.2.4 設置時間重試范圍
- 2.2.5 設置特定異常類型
- 2.2.6 根據返回值判斷是否重試
- 3、總結
1、引言
小屌絲:魚哥,最近python的文章寫的有點少了!
小魚:也不算少,只是最近大部分精力都放在全鏈路壓測專欄的文章。
小屌絲:你這全鏈路壓測沒攔著你寫,但是python文章也不能不更新啊。
小魚:我凸(艸皿艸 )~ ~ 天天凌晨兩點半才去睡覺了,還想我啥時候睡覺…
小屌絲:睡覺歸睡覺,但是python文章不能不更新啊。
小魚:我屮艸芔茻~ ~ 我白天上班,還得加加班,晚上10:30 ~ 凌晨2:30 才有時間寫文章,你這是壓榨! !
小屌絲:我這是為了妹子~ ~
小魚:別那妹子做擋箭牌,快說吧,今天遇到啥問題了?
小屌絲:…說實話,最近有個妹子問我,異常有哪些寫法!
小魚:這個問題,問的很好。
關于異常的寫法,小魚最近在面試官的時候,也會經常問到求職者。
但是回答的,有點…不完整吧…
其實關于異常的寫法,小魚整理過一篇《常用斷言及異常處理》,只是當時是在編寫Web端自動化框架時,整理的,
那篇博文,更多的是python自帶的庫。
而今天我們要來介紹的,是第三方庫–retrying!
2、異常進階寫法
2.1 普通寫法
2.1.1 追加日志定位異常
我們在通過日志輸出,來定位異常是很常見的一種,
例如:
這個寫法,也是簡單版的異常寫法
2.1.2 增加重試機制
增加重試次數,也就是說第一次請求失敗,再次發起請求,直到請求成功。
這個一般應用于兩種場景:
- 爬蟲
- 安全測試的攻防演練
我們來看下代碼:
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19def do_something():passattemps = 0 success = Flasewhile attemps < 4 and not success:try:do_something()success = Trueexcept:attemps += 1if attemps ==4:break小屌絲:這個寫法,不錯呢。
小魚:嗯,跟第一個相比,這個寫法,更明確一下,也更高大上一些。
小屌絲:那還有更高大上的寫法嗎。
小魚:那必須的,今天主角還沒出場呢。
2.2 進階寫法
今天我們來說的這個模塊,就是retrying,
也是第三方模塊,主要是對程序中異常重試的一種優雅的解決方案。
2.2.1 安裝
安裝方式,老規矩,直接pip安裝:
pip install retrying如果覺得每次都pip install 費時費力,那就看看小魚這兩篇:
《Python3,選擇Python自動安裝第三方庫,從此跟pip說拜拜!!》
《Python3,我低調的只用一行代碼,就導入Python所有庫!》
2.2.1 裝飾器retry使用
retrying模塊中,提供了一個裝飾器函數retry;
裝飾的函數會在運行失敗的情況下重新執行,默認一直報錯就一直重試,直到成功為止。
我們來看下代碼
小屌絲:為什么每次執行這段,都會打印出不同次數的"this is a test!"
小魚:這是由于我們程序中只要隨機整數大于1就會打印并且拋出異常。
但是由于我們有裝飾器函數 retry,所以在發生異常就會重新再次執行方法,直到隨機整數大于1,就會打印“Nice!”。
小屌絲:哦,這樣啊,那我不想一直這么重試下去,能不能添加點限制之類的呢?
小魚:嗯,可以的。我們不妨添加最大重試次數為4次。
2.2.2 添加最大次數限制
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19import random from retrying import retry#retry 裝飾器添加最大次數限制 @retry(stop_max_attempt_number = 4) def do_something_times():print(f"do something several times")raise Exception("raise exception")do_something_times()小屌絲:真的呢,最多就是4次,那還有別的限制嗎?
小魚:這必須的。
2.2.3 添加最長重試時間
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19from retrying import retry# 限制最長重試時間(從執行方法開始計算) @retry(stop_max_delay = 4000) def do_something_intime():print(f"do something in time")raise Exception("raise exception")do_something_intime()2.2.4 設置固定重試時間
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19from retrying import retry# 設置固定重試時間 @retry(wait_fixed = 3000) def wait_fixed_time():print(f"wait")raise Exception("raise exception")wait_fixed_time()2.2.4 設置時間重試范圍
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19from retrying import retry# 設置重試時間的隨機范圍 @retry(wait_random_min=1000,wait_random_max=2000) def wait_random_time():print(f"wait")raise Exception("raise exception")wait_random_time()2.2.5 設置特定異常類型
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19from retrying import retry#根據異常重試 def retry_if_io_error(exception):return isinstance(exception, IOError)# 設置特定異常類型重試 @retry(retry_on_exception=retry_if_io_error) def retry_special_error():print(f"retry io error")raise IOError("raise exception")retry_special_error()在這里,我們自己定義一個函數,判斷異常類型,然后將函數作為參數傳給裝飾函數 retry ,如果異常類型符合,就會進行重試。
2.2.6 根據返回值判斷是否重試
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2021-11-19from retrying import retry# 通過返回值判斷是否重試 def retry_if_result_none(result):# return result is Noneif result =="123":return True@retry(retry_on_result=retry_if_result_none) def might_return_none():print("Retry forever ignoring Exceptions with no wait if return value is None")return "123"might_return_none()這里我們定義了一個判斷返回值的函數,然后將這個函數作為參數傳給 retry 裝飾函數。當結果返回是“123”時,就會一直重試執行 might_return_none 函數。
3、總結
在實際應用中,有的大佬偏向于使用第三方庫,而有的大佬,喜歡自帶的庫。
不管是python自帶的庫,還是第三方庫,在擼碼過程中,能直接拋出異常,定位異常,就是最好。
所以,
- 如果喜歡自帶庫,那就看這篇:《常用斷言及異常處理》
- 如果喜歡第三方庫,就看此篇《Python3,異常進階寫法之retrying》
總結
以上是生活随笔為你收集整理的Python3,异常进阶写法之retrying。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络安全 Windows用户密码破解 使
- 下一篇: Redis学习(一)之 持久化、主从与哨