日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python try...finally...的實現方法

瀏覽:238日期:2022-07-04 13:30:36

1. 關于 try.. finally..

假如上帝用 python 為每一個來到世界的生物編寫程序,那么除去中間過程的種種復雜實現,最不可避免的就是要保證每個實例最后都要掛掉。代碼可簡寫如下:

try: born() # 出生 # 正常降臨世界 # do something..except ValueError: # 安排錯誤 # do something...except AttributeError: # 特征錯誤 # do something...except TypeError: # 種類錯誤 # do something...... # 等等雜七雜八的錯誤finally: go_die() # 掛掉 come_to_see_me() # 然后來見我 reincarnate() # 下一輪,安排!

這就是 finally 的作用和實例。就算捕獲異常后再次出現異常,最終也能保證 go_die 方法會執行,但是,如果 go_die 方法出現錯誤,那么就不能正常去見上帝了。為了保證每個生物(不管有沒有掛掉)都能見到上帝他老人家,并開始下一個輪回(不管有沒有見到),需要做如下處理:

...finally: try: go_die() finally: try: come_to_see_me() finally: reincarnate()

OK,功能雖然實現了,但按照 The Zen of Python 所說:Flat is better than nested.(扁平優于嵌套),那么這段代碼就略顯丑陋了。為了遵循 python 美學,我們可以對這段進行優化,使它看起來更為美觀。

2. 錯誤的上下文:__context__

在此之前,需要引入一個新的概念: __context__,__context__ 的字面意思就是上下文,它屬于錯誤的一個屬性。在錯誤捕獲中,它意味著當你處理一個錯誤時,另一個錯誤發生了。也就是說,你所捕獲的錯誤雖然被成功捕獲了,但當捕獲完成時,你的一些操作導致另一個錯誤發生,而這個錯誤并沒有被捕獲。通常情況下,如果處理的好,那么當前錯誤的 __context__ 的值為 None,如果處理不好那就是你所捕獲的錯誤。比如下面的代碼:

def type_err(): raise TypeError(’this is a type error.’)def after_type_err(): raise ValueError(’this is a value error.’)try: type_err()except TypeError: after_type_err()

執行結果為:

Traceback (most recent call last): File '<ipython-input-4-189a22d65266>', line 8, in <module> type_err() File '<ipython-input-4-189a22d65266>', line 2, in type_err raise TypeError(’this is a type error.’)TypeError: this is a type error.During handling of the above exception, another exception occurred:Traceback (most recent call last): File 'C:UserslineuAppDataLocalProgramsPythonPython37libsite-packagesIPythoncoreinteractiveshell.py', line 3326, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File '<ipython-input-4-189a22d65266>', line 10, in <module> after_type_err() File '<ipython-input-4-189a22d65266>', line 5, in after_type_err raise ValueError(’this is a value error.’)ValueError: this is a value error.

在上面的錯誤信息中,當前錯誤類型為 ValueError,它的 __context__ 屬性值為 TypeError 實例,而 TypeError 實例的 __context__ 為 None。

3. FinalExecutor:優雅的 finally

有了 __context__ 的概念,我們就可以基于此實現一個優雅的“輪回”了。基本思路為:依次執行方法,如果方法報錯,那么就將該錯誤的 __context__ 值設置為上一個錯誤(如果有)。最后等到所有方法執行完畢,再拋出最后一個錯誤,那么此時的錯誤將包含所有可能被引發的錯誤信息。具體代碼如下:

class FinalExecutor(object): '''終極執行器 用于確保你所有的方法都會被執行(不管中途有沒有方法報錯) 同時能看到正確的錯誤信息 ''' def __init__(self): self.last_err = None # 保存最近發生的錯誤 def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): # 如果有發生錯誤,則拋出 if self.last_err: raise self.last_err def call(self, func, *args, **kwargs): '''調用執行方法''' try: func(*args, **kwargs) except Exception as e: # Exception 捕獲所有繼承自它或它子類的錯誤類型 # 捕獲它等于捕獲幾乎所有錯誤 if self.last_err:# 將本次錯誤的上下文定義為上一次錯誤e.__context__ = self.last_err # 更新為當前錯誤 self.last_err = e

我們的終極執行器使用示例為:

# 定義 3 個方法用于測試def type_err(): print(’type error’) raise TypeError(’x’)def value_err(): print(’value error’) raise ValueError(’x’)def attr_err(): print(’attr error’) raise AttributeError(’x’)# 使用 with 語句來啟動終極執行器with FinalExecutor() as e: e.call(type_err) e.call(value_err) e.call(attr_err)

運行可以看到方法最終都被執行了,且錯誤信息一個不漏:

type errorvalue errorattr errorTraceback (most recent call last): File '<ipython-input-5-1b07c576630b>', line 19, in call func(*args, **kwargs) File '<ipython-input-6-d602d89ed0e7>', line 3, in type_err raise TypeError(’x’)TypeError: xDuring handling of the above exception, another exception occurred:Traceback (most recent call last): File '<ipython-input-5-1b07c576630b>', line 19, in call func(*args, **kwargs) File '<ipython-input-6-d602d89ed0e7>', line 8, in value_err raise ValueError(’x’)ValueError: xDuring handling of the above exception, another exception occurred:Traceback (most recent call last): File 'C:UserslineuAppDataLocalProgramsPythonPython37libsite-packagesIPythoncoreinteractiveshell.py', line 3326, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File '<ipython-input-6-d602d89ed0e7>', line 19, in <module> e.call(attr_err) File '<ipython-input-5-1b07c576630b>', line 15, in __exit__ raise self.last_err File '<ipython-input-5-1b07c576630b>', line 19, in call func(*args, **kwargs) File '<ipython-input-6-d602d89ed0e7>', line 13, in attr_err raise AttributeError(’x’)AttributeError: x

4. 使用 ExitStack

有了我們的終極執行器,上帝就可以優雅的寫代碼了。為了讓每個人都能這樣優雅的寫 python 代碼,python 為我們提供了一個封裝好的功能,當然它的實現要比我們的終極執行器復雜一些(考慮的也更周到一些~)。我們可以通過 contextlib 模塊導入該方法并使用:

from contextlib import ExitStackwith ExitStack() as stack: stack.callback(type_err) stack.callback(value_err) stack.callback(attr_err)

注意該 ExitStack 與 FinalExecutor 不同的是,它是倒序執行的。

以上就是python try...finally...的實現方法的詳細內容,更多關于python try...finally的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美天堂在线| 国产一区亚洲| 日韩午夜精品| 欧美日韩日本国产亚洲在线| 999久久久免费精品国产| 水蜜桃精品av一区二区| 精品在线网站观看| 动漫av一区| 欧美韩日一区| 精品丝袜在线| 蜜桃国内精品久久久久软件9| 青青久久av| 中文在线一区| 免费欧美在线视频| 日韩福利视频网| 国产精品4hu.www| 成人国产精品一区二区免费麻豆| 精品视频一区二区三区在线观看 | 国内亚洲精品| 国产亚洲一级| 日韩中出av| 国产精品嫩模av在线| 久久精品网址| 久久精品国产大片免费观看| 国产亚洲精品v| 日韩精品视频一区二区三区| 国产精品一在线观看| 狂野欧美性猛交xxxx| 亚洲国产欧美日本视频| 国产高清一区二区| 蜜桃视频在线观看一区| 国产日产一区| 97视频热人人精品免费| 午夜欧美视频| 日韩高清不卡一区| 国产精品99在线观看| 不卡在线一区二区| 亚欧成人精品| 国产一区调教| 亚洲精品在线观看91| 91精品国产自产观看在线| 国产成人免费视频网站视频社区| 亚洲高清激情| 青青草91视频| 蜜桃成人精品| 六月婷婷一区| 国产精品porn| 婷婷亚洲五月| 国产精品一区二区精品| 香蕉成人av| 亚洲欧洲日韩精品在线| 国产一区国产二区国产三区| 狠狠爱成人网| 国产精品99久久免费观看| 亚洲国产专区| 国产精品一区高清| 悠悠资源网久久精品| 国产精品亚洲成在人线| 久久亚洲国产| 久久av影视| 日韩高清在线不卡| 久久影院一区二区三区| 999精品在线| 国产探花一区在线观看| 久久青草久久| 日本a级不卡| 999国产精品| 国产日本精品| 亚洲精品一区二区妖精| 国产激情欧美| 亚洲综合电影一区二区三区| 国产精品www.| 国产精品毛片在线| 国产96在线亚洲| 香蕉视频成人在线观看| 久久不见久久见中文字幕免费| 欧美成人精品| 久久影院资源站| 亚州精品视频| 国产精品88久久久久久| 精品三级av| 91九色综合| 午夜在线精品偷拍| 免费福利视频一区二区三区| 国产欧美自拍| 蜜桃视频一区二区| 999久久久91| 日产精品一区二区| 国产日韩一区二区三区在线播放 | 久久久水蜜桃av免费网站| 国产情侣一区| 亚洲香蕉视频| 99re国产精品| 精品免费av在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 一区二区三区网站| 99久久99视频只有精品| 成人午夜网址| 欧美1区二区| 日韩中文字幕无砖| 蜜臀久久99精品久久久画质超高清 | 免费在线成人| 日本午夜精品| 亚洲精品中文字幕99999| 日韩午夜高潮| 视频一区中文| 色婷婷狠狠五月综合天色拍| 丁香婷婷久久| 国产videos久久| 青草综合视频| 日韩av中文在线观看| 热久久久久久久| 亚洲一卡久久| 亚洲免费网址| 羞羞答答国产精品www一本| 精品一区亚洲| 伊人久久婷婷| 亚洲免费激情| 亚洲少妇自拍| 久久国产88| 视频一区中文字幕国产| 亚洲一区二区成人| 日本 国产 欧美色综合| 亚洲综合图色| 蜜臀av国产精品久久久久| 日韩一区精品字幕| 亚洲久久视频| 日本91福利区| 国产精品伊人| 粉嫩av一区二区三区四区五区 | а√天堂8资源中文在线| 精品高清久久| 超碰超碰人人人人精品| 91精品婷婷色在线观看| 欧美国产91| 西西人体一区二区| 色8久久久久| 日韩二区三区在线观看| 国产乱子精品一区二区在线观看 | 国产成人精品999在线观看| 精品国产乱码久久久| 国产精品久久观看| 久久美女性网| 在线看片日韩| 久久99视频| 久久裸体视频| 免费精品视频最新在线| 日韩激情视频网站| 精品五月天堂| 亚洲福利久久| 免费一区二区视频| 久久精品超碰| 高清日韩欧美| 欧美成人综合| 日韩视频1区| 麻豆精品在线| 色老板在线视频一区二区| 国产一级一区二区| 欧美日韩一区二区三区四区在线观看| 麻豆精品99| 精品一区在线| 欧美日韩亚洲三区| 成人三级高清视频在线看| 国产一区视频在线观看免费| 亚洲久久一区| 成人台湾亚洲精品一区二区| 欧美aa国产视频| 欧美在线不卡| 日韩一区二区在线免费| 免费日韩av片| 精品视频黄色| 国产精品女主播一区二区三区| 日本不卡一二三区黄网| 色欧美自拍视频| 日韩专区欧美专区| 久久一区国产| 亚洲激情欧美| 国产福利一区二区精品秒拍| 日韩三区免费| 国产日韩一区二区三区在线播放| 六月婷婷综合| 亚洲久久在线| 中文字幕在线视频久| 蜜桃视频免费观看一区| 成人三级高清视频在线看| 亚洲一区二区小说| 蜜桃av.网站在线观看| 亚洲精品福利| 日韩精品一区二区三区免费观看| 日韩高清三区| 999国产精品视频| 国产精品久久久久久久久久白浆 | 国产欧美日韩视频在线 | 亚洲激情社区| 老司机精品在线| 亚洲免费网址| 九色porny丨国产首页在线| 久久精品99久久久| 亚洲激情精品| 亚洲风情在线资源|