Python學(xué)習(xí)之異常中的finally使用詳解
今天我們來(lái)學(xué)習(xí)一下 異常語(yǔ)法 中的另一個(gè)成員 —> finally ; 通過(guò)學(xué)習(xí) finally ,可以幫助我們更好的處理異常。
finally 的功能與用法
finally 的功能:finally的是最后的意思,配合異常的語(yǔ)法來(lái)說(shuō),它就是最后執(zhí)行的代碼塊。
無(wú)論是否發(fā)生了異常,一定會(huì)執(zhí)行 finally 的代碼塊
在函數(shù)中,即便在 try 或 except 中進(jìn)行了 return 也依舊會(huì)執(zhí)行 finally 代碼塊
try 語(yǔ)法 至少要伴隨 except 或 finally 中的一個(gè)
finally 的用法:示例如下
try: <代碼塊1> except: <代碼塊2> finally: <代碼塊3>
finally 示例案例
def test(): try: 1 / 0 except Exception as e: print(e) finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> division by zero # >>> 通用異常捕獲已完成
finally 觸發(fā)的必然性與優(yōu)先級(jí)
接下來(lái)我們看看 在 try 或 except 中進(jìn)行了 return 的場(chǎng)景:
def test(): try: 1 / 0 except Exception as e: return e finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> 通用異常捕獲已完成 # >>> division by zero
這里我們是不是發(fā)現(xiàn)了一個(gè)問(wèn)題?先輸出的 finally 代碼塊,后輸出的 except 的 代碼塊。
Python 程序的執(zhí)行順序是自上而下執(zhí)行的,為什么會(huì)出現(xiàn)這樣的結(jié)果呢?我么嘗試在 except 的 代碼塊增加一行輸出的測(cè)試代碼,看一下執(zhí)行的順序究竟是什么樣的。
def test(): try: 1 / 0 except Exception as e: print('exception——test') return e finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> exception——test # >>> 通用異常捕獲已完成 # >>> division by zero
從執(zhí)行結(jié)果可以得出結(jié)論,程序依然是自上而下執(zhí)行的。其實(shí)造成這樣結(jié)果的原因是捕獲到異常后會(huì)將異常信息賦值給變量 e 返回,在調(diào)用test()時(shí)將返回值賦值給了 result ,因此在打印時(shí)可以得到的結(jié)果就是先輸出的 finally 的代碼塊,再輸出的 result 的賦值結(jié)果 。
同時(shí)也在次印證了我們上文針對(duì) finally 的功能的描述 :try 或 except 中進(jìn)行了 return 也依舊會(huì)執(zhí)行 finally 代碼塊。
既然 except 的代碼塊我們得到了證實(shí),那么 try 的代碼塊呢?
def test(): try: print('try_test') return 'try' except Exception as e: print(e) finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> try_test # >>> 通用異常捕獲已完成 # >>> try # >>> 得出了同樣的 finally 必然觸發(fā)性 的結(jié)論
再思考一個(gè)問(wèn)題,之前我們的 finally 的代碼塊 都是輸出的 print 語(yǔ)句,如果我們?cè)?try 或 except 與 finally 的代碼塊 中都使用 return ,那么會(huì)返回誰(shuí)的 return 的結(jié)果呢?
def test(): try: 1 / 0 except Exception as e: return e finally: return '通用異常捕獲已完成' result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> 通用異常捕獲已完成
從執(zhí)行結(jié)果我們看到, except 與 finally 的代碼塊 中都使用 return ,同時(shí)我們也知道會(huì)先觸發(fā) except 代碼塊的 return ,但是最終返回的依然是 finally 的代碼塊 中都使用 return。
雖然 except 代碼塊有 return ,但是因?yàn)?finally 的代碼塊 中也使用了 return ,所以我們的程序最終還是選擇了 finally 的代碼塊 中的 return 進(jìn)行返回。最終得出 finally 的代碼塊 中的 return 返回的級(jí)別更高的結(jié)論。
try 語(yǔ)法 伴隨 except 或 finally 的必然性
我們看下面的一個(gè)小例子
def test(): try: 1 / 0 finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> 通用異常捕獲已完成 # >>> Traceback (most recent call last): # >>> File "D:\PycharmProjects\XXX\XXX.py", line 81, in <module> # >>> result = test() # >>> File "D:\PycharmProjects\XXX\XXX.py", line 76, in test # >>> 1 / 0 # >>> ZeroDivisionError: division by zero
可以看到,雖然產(chǎn)生了報(bào)錯(cuò),但是我們的 finally 代碼塊依然被執(zhí)行了。讓我們?cè)囋囋谶@種情況下,直接使用 return 會(huì)怎么樣?
def test(): try: 1 / 0 finally: return '通用異常捕獲已完成' result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> 通用異常捕獲已完成
此時(shí)我們發(fā)現(xiàn), finally 代碼塊依然被執(zhí)行了,不僅如此,剛剛出現(xiàn)的錯(cuò)誤也被忽略了。說(shuō)明當(dāng) try 出現(xiàn)異常的時(shí)候會(huì)被直接忽略,直接跳轉(zhuǎn)到 finally 的代碼塊。
這就是 try 與 finally 的組合效果,不過(guò)在我們平時(shí)的工作中,還是希望 使用 try 配合 except 將 異常類型(信息) 友好的打印出來(lái),再進(jìn)行return 會(huì)更好。
finally 的歷史
在 python 2.5 版本之前, finally 需要獨(dú)立使用不可以和 try 進(jìn)行配合,在 python 2.5 版本 之后才演變成了現(xiàn)在這個(gè)樣子。
如果未來(lái)有機(jī)會(huì)使用較老版本的 python ,看到這樣的情況,不要覺(jué)得奇怪。
到此這篇關(guān)于Python學(xué)習(xí)之異常中的finally使用詳解的文章就介紹到這了,更多相關(guān)Python異常 finally內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Web框架Flask中使用七牛云存儲(chǔ)實(shí)例
這篇文章主要介紹了Python Web框架Flask中使用七牛云存儲(chǔ)實(shí)例,本文也對(duì)七牛云存儲(chǔ)Python SDK的一個(gè)使用示例,需要的朋友可以參考下2015-02-02python導(dǎo)出hive數(shù)據(jù)表的schema實(shí)例代碼
這篇文章主要介紹了python導(dǎo)出hive數(shù)據(jù)表的schema實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python使用SQLite和Excel操作進(jìn)行數(shù)據(jù)分析
這篇文章主要介紹了Python使用SQLite和Excel操作進(jìn)行數(shù)據(jù)分析,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python?函數(shù)參數(shù)11個(gè)案例分享
大家好,今天給大家分享一下明哥整理的一篇?Python?參數(shù)的內(nèi)容,內(nèi)容非常的干,全文通過(guò)案例的形式來(lái)理解知識(shí)點(diǎn),自認(rèn)為比網(wǎng)上?80%?的文章講的都要明白,如果你是入門不久的?python?新手,相信本篇文章應(yīng)該對(duì)你會(huì)有不小的幫助,需要的朋友可以參考下2023-02-02Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼
這篇文章主要介紹了Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下2016-08-08