溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Python finally語句

發(fā)布時間:2020-08-26 09:25:31 來源:億速云 閱讀:588 作者:Leah 欄目:編程語言

本篇文章為大家展示了什么是Python finally語句,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

有些時候,程序在 try 塊里打開了一些物理資源(例如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件等),這些物理資源都必須被顯式回收。

Python 的垃圾回收機制不會回收任何物理資源,只能回收內(nèi)存中對象所占用的內(nèi)存。

什么是Python finally語句

那么在哪里回收這些物理資源呢?在 try 塊里回收,還是在 except 塊中進行回收?假設(shè)程序在 try 塊里進行資源回收,根據(jù)圖 1 所示的異常捕獲流程,如果 try 塊的某條語句引發(fā)了異常,該語句后的其他語句通常不會獲得執(zhí)行的機會,這將導致位于該語句之后的資源回收語句得不到執(zhí)行。如果在 except 塊里進行資源回收,因為 except 塊完全有可能得不到執(zhí)行,這將導致不能及時回收這些物理資源。

為了保證一定能回收在 try 塊中打開的物理資源,異常處理機制提供了 finally 塊。不管 try 塊中的代碼是否出現(xiàn)異常,也不管哪一個 except 塊被執(zhí)行,甚至在 try 塊或 except 塊中執(zhí)行了 return 語句,finally 塊總會被執(zhí)行。

Python 完整的異常處理語法結(jié)構(gòu)如下:

try:
    #業(yè)務(wù)實現(xiàn)代碼
except SubException as e:
    #異常處理塊1
    ...
except SubException2 as e:
    #異常處理塊2
    ...
else:
    #正常處理塊
finally :
    #資源回收塊
    ...

在異常處理語法結(jié)構(gòu)中,只有 try 塊是必需的,也就是說:如果沒有 try 塊,則不能有后面的 except 塊和 finally 塊;except 塊和 finally 塊都是可選的,但 except 塊和 finally 塊至少出現(xiàn)其中之一,也可以同時出現(xiàn);可以有多個 except 塊,但捕獲父類異常的 except 塊應(yīng)該位于捕獲子類異常的 except 塊的后面;不能只有 try 塊,既沒有 except 塊,也沒有 finally 塊;多個 except 塊必須位于 try 塊之后,finally 塊必須位于所有的 except 塊之后。

看一下程序

import os
def test():
    fis = None
    try:
        fis = open("a.txt")
    except OSError as e:
        print(e.strerror)
        # return語句強制方法返回
        return        # ①
        os._exit(1)     # ②
    finally:
        # 關(guān)閉磁盤文件,回收資源
        if fis is not None:
            try:
                # 關(guān)閉資源
                fis.close()
            except OSError as ioe:
                print(ioe.strerror)
        print("執(zhí)行finally塊里的資源回收!")
test()

上面程序在 try 塊后增加了 finally 塊,用于回收在 try 塊中打開的物理資源。注意在程序的 except 塊中 ① 處有一條 return 語句,該語句強制方法返回。在通常情況下,一旦在方法里執(zhí)行到 return 語句,程序?qū)⒘⒓唇Y(jié)束該方法:現(xiàn)在不會了,雖然 return 語句也強制方法結(jié)束,但一定會先執(zhí)行 finally 塊的代碼。 

運行上面程序,將看到如下運行結(jié)果:

No such file or directory
執(zhí)行finally里的資源回收!

上面的運行結(jié)果表明在方法返回之前執(zhí)行了 finally 塊的代碼。將 ① 處的 return 語句注釋掉,取消 ② 處代碼的注釋,即在異常處理的 except 塊中使用 os._exit(1) 語句來退出 Python 解釋器。運行上面代碼,將看到如下運行結(jié)果:

No such file or directory

上面的運行結(jié)果表明 finally 塊沒有被執(zhí)行。如果在異常處理代碼中使用 os.exit(1) 語句來退出 Python 解釋器,則 finally 塊將失去執(zhí)行的機會。

除非在 try 塊、except 塊中調(diào)用了退出 Python 解釋器的方法,否則不管在 try 塊、except 塊中執(zhí)行怎樣的代碼,出現(xiàn)怎樣的情況,異常處理的 finally 塊總會被執(zhí)行。調(diào)用 sys.exit() 方法退出程序不能阻止 finally 塊的執(zhí)行,這是因為 sys.exit() 方法本身就是通過引發(fā) SystemExit 異常來退出程序的。

在通常情況下,不要在 finally 塊中使用如 return 或 raise 等導致方法中止的語句(raise 語句將在后面介紹),一旦在 finally 塊中使用了 return 或 raise 語句,將會導致 try 塊、except 塊中的 return、raise 語句失效。看如下程序:

def test():
    try:
        # 因為finally塊中包含了return語句
        # 所以下面的return語句失去作用
        return True
    finally:
        return False
a = test()
print(a)

上面程序在 finally 塊中定義了一條 return False 語句,這將導致 try 塊中的 return true 失去作用。運行上面程序,將打印出 False 的結(jié)果。
如果 Python 程序在執(zhí)行 try 塊、except 塊時遇到了 return 或 raise 語句,這兩條語句都會導致該方法立即結(jié)束,那么系統(tǒng)執(zhí)行這兩條語句并不會結(jié)束該方法,而是去尋找該異常處理流程中的 finally 塊,如果沒有找到 finally 塊,程序立即執(zhí)行 return 或 raise 語句,方法中止;如果找到 finally 塊,系統(tǒng)立即開始執(zhí)行 finally 塊,只有當 finally 塊執(zhí)行完成后,系統(tǒng)才會再次跳回來執(zhí)行 try 塊、except 塊里的 return 或 raise 語句;如果在 finally 塊里也使用了 return 或 raise 等導致方法中止的語句,finally 塊己經(jīng)中止了方法,系統(tǒng)將不會跳回去執(zhí)行 try 塊、except 塊里的任何代碼。

上述內(nèi)容就是什么是Python finally語句,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI