日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Python異常還能寫得如此優(yōu)雅!

???

創(chuàng)新互聯(lián)建站是一家專業(yè)提供盧氏企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為盧氏眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

本文轉(zhuǎn)載自微信公眾號(hào)「Python技術(shù)」,作者派森醬 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python技術(shù)公眾號(hào)。

在寫程序時(shí),我們會(huì)經(jīng)常碰到程序出現(xiàn)異常,這時(shí)候我們就不得不處理這些異常,以保證程序的健壯性。

處理異常的版本有以下幾種,你通常的做法是哪種?

不負(fù)責(zé)任版本

這種情況下,不作任何處理,任由程序報(bào)錯(cuò),從而導(dǎo)致程序中斷。

針對(duì)簡(jiǎn)單的程序,這樣做沒什么問題,大不了我遇到問題之后把問題解決,然后重新運(yùn)行。但是如果是復(fù)雜的系統(tǒng)就會(huì)很麻煩了,可能你一個(gè)異常阻塞了系統(tǒng)的運(yùn)行,帶來災(zāi)難性的后果。

簡(jiǎn)單處理版本

簡(jiǎn)單處理版本,就是加上異常捕獲,在發(fā)生異常時(shí)記錄日志,時(shí)候可以通過日志來定位異常。

def do_something():     pass def log_error(xxx):     pass  try:    do_something() except:     log_error(xxxx) 

改進(jìn)處理版本

對(duì)于簡(jiǎn)單處理版本做了改進(jìn),增加重試次數(shù)。這個(gè)在爬蟲程序中比較常見,第一次請(qǐng)求超時(shí),可能過一會(huì)再請(qǐng)求就成功了,所以重試幾次可能會(huì)消除異常。

attempts = 0 success = False while attempts < 3 and not success:     try:         do_something()         success = True     except:         attempts += 1         if attempts == 3:             break 

但是這樣做仍然不夠優(yōu)雅,你可能要在很多地方去寫這種重試的硬編碼,程序看起來亂糟糟的。

今天就給大家介紹一個(gè)第三方模塊 —— retrying。它是對(duì)程序中異常重試的一種優(yōu)雅的解決方案。

安裝與使用

安裝

安裝命令還是那么平淡無奇:

pip install retrying 

使用

下面給大家介紹一下這個(gè)裝飾函數(shù)有哪些可以使用的參數(shù)。

生命不息,奮斗不止

retrying 提供一個(gè)裝飾器函數(shù) retry,被裝飾的函數(shù)會(huì)在運(yùn)行失敗的情況下重新執(zhí)行,默認(rèn)一直報(bào)錯(cuò)就一直重試。

import random from retrying import retry  @retry def do_something_unreliable():     if random.randint(0, 10) > 1:         print("just have a test")         raise IOError("raise exception!")     else:         return "good job!"  print(do_something_unreliable()) 

運(yùn)行這個(gè)程序,大家可以看到每次打印“just have a test”這句話的次數(shù)都不一樣。這是由于我們程序中只要隨機(jī)整數(shù)大于1就會(huì)打印并且拋出異常。但是由于我們有裝飾器函數(shù) retry,所以在發(fā)生異常就會(huì)重新再次執(zhí)行方法,直到隨機(jī)整數(shù)大于1,就會(huì)打印“good job!”。

做人不能太固執(zhí)

這種無休止地重試,簡(jiǎn)直是浪費(fèi)生命,浪費(fèi)資源。我們要建設(shè)綠色家園,所以不妨加點(diǎn)限制:

# 最大重試次數(shù) @retry(stop_max_attempt_number=5) def do_something_limited():     print("do something several times")     raise Exception("raise exception")  do_something_limited() 

珍惜有限的時(shí)間

一寸光陰一寸金,寸金難買寸光陰。我們要珍惜有限的時(shí)間,所以不妨給我們的重試加個(gè)時(shí)間限制:

# 限制最長(zhǎng)重試時(shí)間(從執(zhí)行方法開始計(jì)算) @retry(stop_max_delay=5000) def do_something_in_time():     print("do something in time")     raise Exception("raise exception")  do_something_in_time() 

駐足欣賞路上風(fēng)景

人生匆匆數(shù)十載,不要一路狂奔而忘記欣賞路邊的美景,有時(shí)候我們需要花點(diǎn)時(shí)間來欣賞一路的美景:

# 設(shè)置固定重試時(shí)間 @retry(wait_fixed=2000) def wait_fixed_time():     print("wait")     raise Exception("raise exception")  wait_fixed_time() 

給失敗設(shè)個(gè)限

雖說我們需要屢敗屢戰(zhàn)的韌性,但是失敗也要有個(gè)限度,不能在失敗中度過一生:

# 設(shè)置重試時(shí)間的隨機(jī)范圍 @retry(wait_random_min=1000,wait_random_max=2000) def wait_random_time():     print("wait")     raise Exception("raise exception")  wait_random_time() 

有些人值得等待

茫茫人海中,我就是要等到那個(gè)對(duì)的人:

# 根據(jù)異常重試 def retry_if_io_error(exception):     return isinstance(exception, IOError)  # 設(shè)置特定異常類型重試 @retry(retry_on_exception=retry_if_io_error) def retry_special_error():     print("retry io error")     raise IOError("raise exception")  retry_special_error() 

我們自己定義一個(gè)函數(shù),判斷異常類型,然后將函數(shù)作為參數(shù)傳給裝飾函數(shù) retry ,如果異常類型符合,就會(huì)進(jìn)行重試。

有些結(jié)果是我們希望見到的

人生并不是一帆風(fēng)順,有些時(shí)候我們會(huì)遇到挫折,這些挫折也許在一開始就是我們想要的:

# 通過返回值判斷是否重試 def retry_if_result_none(result):     """Return True if we should retry (in this case when result is None), False otherwise"""     # return result is None     if result =="111":         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 "111"  might_return_none() 

這里我們定義了一個(gè)判斷返回值的函數(shù),然后將這個(gè)函數(shù)作為參數(shù)傳給 retry 裝飾函數(shù)。當(dāng)結(jié)果返回是“111”時(shí),就會(huì)一直重試執(zhí)行 might_return_none 函數(shù)。

生活豐富多彩,并不單調(diào)

我們的生活是豐富多彩的,從來都沒有很單調(diào)。所以上面這些參數(shù),我們可以隨意組合使用,并不限定每次只能用一個(gè)。比如你可以限定遇到 IOError 時(shí)進(jìn)行重試,并且重試次數(shù)最多5次。


網(wǎng)站欄目:Python異常還能寫得如此優(yōu)雅!
轉(zhuǎn)載注明:http://www.5511xx.com/article/cdjcepj.html