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

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

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

瀏覽:236日期: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久久,三上悠亚国产精品一区二区三区
午夜久久av | 久热精品在线| 国产图片一区| 97久久亚洲| 日韩一二三区在线观看| 亚洲日本在线观看视频| 亚洲精品无播放器在线播放| 亚洲精品欧美| 国产日产精品_国产精品毛片| 麻豆一区二区三区| 久久国产麻豆精品| 国产欧美日韩影院| 欧美激情久久久久久久久久久| 亚洲午夜在线| 亚洲福利一区| 欧美专区18| 亚洲精一区二区三区| 欧美偷窥清纯综合图区| 91福利精品在线观看| 日本久久一区| 麻豆精品视频在线观看视频| 国产自产自拍视频在线观看| av高清不卡| 亚洲91久久| 国产精品普通话对白| 日韩欧美激情电影| 精品少妇av| 亚洲成av人片一区二区密柚| 精品1区2区3区4区| 日本欧美一区二区| 精品女同一区二区三区在线观看| 国产精品日韩久久久| 久久av在线| 欧美精品三级在线| 97精品在线| 欧美精品黄色| 欧美一区影院| 成人福利av| 久久一区二区三区电影| 国产一区日韩一区| 日韩精品五月天| 日本久久精品| 老司机精品久久| 国产精品日韩精品中文字幕| 日韩欧美美女在线观看| 欧美13videosex性极品| 亚洲欧洲日韩| 亚洲国产成人二区| 亚洲深夜福利在线观看| 粉嫩av一区二区三区四区五区| 日本综合精品一区| 精品久久在线| 日韩精品一二三区| 美女久久精品| 亚洲国产一区二区三区在线播放| 久久精品免费看| 尤物tv在线精品| 国产精品亚洲二区| 亚洲综合欧美| 国产aⅴ精品一区二区三区久久| 青草av.久久免费一区| 国产成人精品一区二区三区在线| 国产视频一区三区| 久久精品av麻豆的观看方式| 久久久久久久久久久妇女 | 亚洲欧美在线专区| 国产精品亚洲综合色区韩国| 激情偷拍久久| 久久成人高清| 国产精品日韩| 黄色在线观看www| 亚洲精品成a人ⅴ香蕉片| 成人午夜国产| 国产精品日韩精品在线播放| 亚洲免费影视| 色婷婷久久久| 麻豆精品视频在线观看| 免费视频最近日韩| 成人台湾亚洲精品一区二区| 伊人久久大香伊蕉在人线观看热v| 国产精品试看| 久久精品免费看| 亚洲精品大全| 日韩午夜一区| 精品捆绑调教一区二区三区| 天堂精品久久久久| 久久中文视频| 麻豆国产在线| 免费在线日韩av| 日本不卡一区二区| 中国女人久久久| 日韩综合精品| 精品久久91| 欧美亚洲tv| 美国三级日本三级久久99| 久久视频一区| 久久精品国产亚洲一区二区三区| 成人污污视频| 亚洲18在线| 视频一区二区中文字幕| 国精品一区二区| 美女久久久久久| 青青草91视频| 美女精品在线| 国产精品婷婷| 欧美在线资源| 久久理论电影| 久久婷婷激情| 在线一区视频观看| 国产精品yjizz视频网| 麻豆91小视频| 日韩av成人高清| 日本亚洲不卡| 亚洲综合中文| 欧美综合国产| 亚洲一区欧美| 日韩专区在线视频| 一区二区自拍| 9国产精品视频| 黄色亚洲免费| 亚洲一区二区三区免费在线观看| 老司机久久99久久精品播放免费| 亚洲久久视频| 天堂成人国产精品一区| 激情久久五月| 免费久久精品| 亚洲午夜在线| 红桃视频国产精品| 日韩视频中文| 日韩在线一二三区| 亚洲69av| 国产日韩欧美高清免费| 国产精品久久久久久久久免费高清 | 免费久久99精品国产自在现线| 日韩精品导航| 一区二区精品| 日韩不卡一区二区| 国产精品亲子伦av一区二区三区| 欧美福利专区| 私拍精品福利视频在线一区| 国产精品av一区二区| 亚洲欧美日韩国产一区二区| 亚洲不卡视频| 免费在线亚洲| 91av亚洲| 国产一区二区高清| 亚洲精品字幕| 国产精品美女久久久久久不卡| 好看的av在线不卡观看| 激情91久久| 亚洲三级国产| 免费一区二区三区在线视频| 色综合狠狠操| 午夜国产精品视频| 蜜桃av一区二区| 国产日韩精品视频一区二区三区| 亚洲午夜视频| 亚洲激情国产| 人人精品久久| av资源中文在线天堂| 不卡在线一区| 中文字幕av一区二区三区人| 日韩国产精品久久久| 精品网站999| 婷婷综合亚洲| 97成人在线| 亚洲综合电影| 日韩在线播放一区二区| 国产精品调教视频| 福利一区视频| 久久国产福利| 麻豆成人在线观看| 亚洲午夜av| 欧美日韩亚洲国产精品| 超碰成人av| 亚洲青青久久| 97精品国产福利一区二区三区| 国产欧美日韩精品一区二区三区| 精精国产xxxx视频在线播放 | 亚洲制服少妇| 国产欧美高清| 99国产精品免费视频观看| 水野朝阳av一区二区三区| 人人精品久久| 久久精品一区二区不卡| 日本精品国产| 久久久亚洲一区| 欧美日韩伊人| 极品日韩av| 国产精品毛片久久久| 亚洲网站视频| 国产精品调教| 日韩午夜av| 精品一区二区三区中文字幕 | 国产一区一一区高清不卡| 五月天综合网站| 嫩草伊人久久精品少妇av杨幂| 久久国产乱子精品免费女| 亚洲精品.com| 久久国内精品自在自线400部|