網(wǎng)站首頁 編程語言 正文
今天我們來學(xué)習(xí)一下 異常語法 中的另一個成員 —> finally ; 通過學(xué)習(xí) finally ,可以幫助我們更好的處理異常。
finally 的功能與用法
finally 的功能:finally的是最后的意思,配合異常的語法來說,它就是最后執(zhí)行的代碼塊。
無論是否發(fā)生了異常,一定會執(zhí)行 finally 的代碼塊
在函數(shù)中,即便在 try 或 except 中進(jìn)行了 return 也依舊會執(zhí)行 finally 代碼塊
try 語法 至少要伴隨 except 或 finally 中的一個
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)先級
接下來我們看看 在 try 或 except 中進(jìn)行了 return 的場景:
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)了一個問題?先輸出的 finally 代碼塊,后輸出的 except 的 代碼塊。
Python 程序的執(zhí)行順序是自上而下執(zhí)行的,為什么會出現(xiàn)這樣的結(jié)果呢?我么嘗試在 except 的 代碼塊增加一行輸出的測試代碼,看一下執(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é)果的原因是捕獲到異常后會將異常信息賦值給變量 e 返回,在調(diào)用test()時將返回值賦值給了 result ,因此在打印時可以得到的結(jié)果就是先輸出的 finally 的代碼塊,再輸出的 result 的賦值結(jié)果 。
同時也在次印證了我們上文針對 finally 的功能的描述 :try 或 except 中進(jìn)行了 return 也依舊會執(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é)論
再思考一個問題,之前我們的 finally 的代碼塊 都是輸出的 print 語句,如果我們在 try 或 except 與 finally 的代碼塊 中都使用 return ,那么會返回誰的 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 ,同時我們也知道會先觸發(fā) except 代碼塊的 return ,但是最終返回的依然是 finally 的代碼塊 中都使用 return。
雖然 except 代碼塊有 return ,但是因?yàn)?finally 的代碼塊 中也使用了 return ,所以我們的程序最終還是選擇了 finally 的代碼塊 中的 return 進(jìn)行返回。最終得出 finally 的代碼塊 中的 return 返回的級別更高的結(jié)論。
try 語法 伴隨 except 或 finally 的必然性
我們看下面的一個小例子
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# >>> result = test() # >>> File "D:\PycharmProjects\XXX\XXX.py", line 76, in test # >>> 1 / 0 # >>> ZeroDivisionError: division by zero
可以看到,雖然產(chǎn)生了報(bào)錯,但是我們的 finally 代碼塊依然被執(zhí)行了。讓我們試試在這種情況下,直接使用 return 會怎么樣?
def test(): try: 1 / 0 finally: return '通用異常捕獲已完成' result = test() print(result) # >>> 執(zhí)行結(jié)果如下: # >>> 通用異常捕獲已完成
此時我們發(fā)現(xiàn), finally 代碼塊依然被執(zhí)行了,不僅如此,剛剛出現(xiàn)的錯誤也被忽略了。說明當(dāng) try 出現(xiàn)異常的時候會被直接忽略,直接跳轉(zhuǎn)到 finally 的代碼塊。
這就是 try 與 finally 的組合效果,不過在我們平時的工作中,還是希望 使用 try 配合 except 將 異常類型(信息) 友好的打印出來,再進(jìn)行return 會更好。
finally 的歷史
在 python 2.5 版本之前, finally 需要獨(dú)立使用不可以和 try 進(jìn)行配合,在 python 2.5 版本 之后才演變成了現(xiàn)在這個樣子。
如果未來有機(jī)會使用較老版本的 python ,看到這樣的情況,不要覺得奇怪。
原文鏈接:https://blog.csdn.net/weixin_42250835/article/details/123490430
相關(guān)推薦
- 2024-04-03 Validator工具驗(yàn)證類,區(qū)分添加,刪除,修改
- 2022-05-01 python中NumPy的安裝與基本操作_python
- 2023-02-15 sql查詢一個數(shù)組中是否包含某個內(nèi)容find_in_set問題_MsSql
- 2023-01-17 關(guān)于最大池化層和平均池化層圖解_python
- 2022-04-07 Swift自定義UITableViewCell背景色_Swift
- 2023-04-02 python去除列表中的空值元素實(shí)戰(zhàn)技巧_python
- 2022-07-20 輕松手寫Spring的IOC
- 2022-10-10 python中sort()函數(shù)用法詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支