<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天我們來學習一下 異常語法 中的另一個成員 —> finally ; 通過學習 finally ,可以幫助我們更好的處理異常。
finally 的功能:finally的是最後的意思,配合異常的語法來說,它就是最後執行的程式碼塊。
無論是否發生了異常,一定會執行 finally 的程式碼塊
在函數中,即便在 try 或 except 中進行了 return 也依舊會執行 finally 程式碼塊
try 語法 至少要伴隨 except 或 finally 中的一個
finally 的用法:範例如下
try: <程式碼塊1> except: <程式碼塊2> finally: <程式碼塊3>
def test(): try: 1 / 0 except Exception as e: print(e) finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執行結果如下: # >>> division by zero # >>> 通用異常捕獲已完成
接下來我們看看 在 try 或 except 中進行了 return 的場景:
def test(): try: 1 / 0 except Exception as e: return e finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執行結果如下: # >>> 通用異常捕獲已完成 # >>> division by zero
這裡我們是不是發現了一個問題?先輸出的 finally 程式碼塊,後輸出的 except 的 程式碼塊。
Python 程式的執行順序是自上而下執行的,為什麼會出現這樣的結果呢?我麼嘗試在 except 的 程式碼塊增加一行輸出的測試程式碼,看一下執行的順序究竟是什麼樣的。
def test(): try: 1 / 0 except Exception as e: print('exception——test') return e finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執行結果如下: # >>> exception——test # >>> 通用異常捕獲已完成 # >>> division by zero
從執行結果可以得出結論,程式依然是自上而下執行的。其實造成這樣結果的原因是捕獲到異常後會將異常資訊賦值給變數 e 返回,在呼叫test()時將返回值賦值給了 result ,因此在列印時可以得到的結果就是先輸出的 finally 的程式碼塊,再輸出的 result 的賦值結果 。
同時也在次印證了我們上文針對 finally 的功能的描述 :try 或 except 中進行了 return 也依舊會執行 finally 程式碼塊。
既然 except 的程式碼塊我們得到了證實,那麼 try 的程式碼塊呢?
def test(): try: print('try_test') return 'try' except Exception as e: print(e) finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執行結果如下: # >>> try_test # >>> 通用異常捕獲已完成 # >>> try # >>> 得出了同樣的 finally 必然觸發性 的結論
再思考一個問題,之前我們的 finally 的程式碼塊 都是輸出的 print 語句,如果我們在 try 或 except 與 finally 的程式碼塊 中都使用 return ,那麼會返回誰的 return 的結果呢?
def test(): try: 1 / 0 except Exception as e: return e finally: return '通用異常捕獲已完成' result = test() print(result) # >>> 執行結果如下: # >>> 通用異常捕獲已完成
從執行結果我們看到, except 與 finally 的程式碼塊 中都使用 return ,同時我們也知道會先觸發 except 程式碼塊的 return ,但是最終返回的依然是 finally 的程式碼塊 中都使用 return。
雖然 except 程式碼塊有 return ,但是因為 finally 的程式碼塊 中也使用了 return ,所以我們的程式最終還是選擇了 finally 的程式碼塊 中的 return 進行返回。最終得出 finally 的程式碼塊 中的 return 返回的級別更高的結論。
我們看下面的一個小例子
def test(): try: 1 / 0 finally: print('通用異常捕獲已完成') result = test() print(result) # >>> 執行結果如下: # >>> 通用異常捕獲已完成 # >>> Traceback (most recent call last): # >>> File "D:PycharmProjectsXXXXXX.py", line 81, in <module> # >>> result = test() # >>> File "D:PycharmProjectsXXXXXX.py", line 76, in test # >>> 1 / 0 # >>> ZeroDivisionError: division by zero
可以看到,雖然產生了報錯,但是我們的 finally 程式碼塊依然被執行了。讓我們試試在這種情況下,直接使用 return 會怎麼樣?
def test(): try: 1 / 0 finally: return '通用異常捕獲已完成' result = test() print(result) # >>> 執行結果如下: # >>> 通用異常捕獲已完成
此時我們發現, finally 程式碼塊依然被執行了,不僅如此,剛剛出現的錯誤也被忽略了。說明當 try 出現異常的時候會被直接忽略,直接跳轉到 finally 的程式碼塊。
這就是 try 與 finally 的組合效果,不過在我們平時的工作中,還是希望 使用 try 配合 except 將 異常型別(資訊) 友好的列印出來,再進行return 會更好。
在 python 2.5 版本之前, finally 需要獨立使用不可以和 try 進行配合,在 python 2.5 版本 之後才演變成了現在這個樣子。
如果未來有機會使用較老版本的 python ,看到這樣的情況,不要覺得奇怪。
到此這篇關於Python學習之異常中的finally使用詳解的文章就介紹到這了,更多相關Python異常 finally內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45