什么是Pythonfinally語(yǔ)句

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

成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)).為客戶提供專業(yè)的德陽(yáng)電信服務(wù)器托管,四川各地服務(wù)器托管,德陽(yáng)電信服務(wù)器托管、多線服務(wù)器托管.托管咨詢專線:13518219792

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

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

什么是Python finally語(yǔ)句

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

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

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

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

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

看一下程序

import os
def test():
    fis = None
    try:
        fis = open("a.txt")
    except OSError as e:
        print(e.strerror)
        # return語(yǔ)句強(qiáng)制方法返回
        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 語(yǔ)句,該語(yǔ)句強(qiáng)制方法返回。在通常情況下,一旦在方法里執(zhí)行到 return 語(yǔ)句,程序?qū)⒘⒓唇Y(jié)束該方法:現(xiàn)在不會(huì)了,雖然 return 語(yǔ)句也強(qiáng)制方法結(jié)束,但一定會(huì)先執(zhí)行 finally 塊的代碼。 

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

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

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

No such file or directory

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

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

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

def test():
    try:
        # 因?yàn)閒inally塊中包含了return語(yǔ)句
        # 所以下面的return語(yǔ)句失去作用
        return True
    finally:
        return False
a = test()
print(a)

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

上述內(nèi)容就是什么是Python finally語(yǔ)句,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:什么是Pythonfinally語(yǔ)句
標(biāo)題網(wǎng)址:http://muchs.cn/article16/gephdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、定制網(wǎng)站、企業(yè)建站、網(wǎng)站改版、外貿(mào)建站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)