日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:Pythonfinally-資源回收

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

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)公司、微信開發(fā)、成都小程序開發(fā)、集團(tuán)成都企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。核心團(tuán)隊均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗,服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都紗窗等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗,同時也獲得了客戶的一致贊賞!

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

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

為了保證一定能回收在 try 塊中打開的物理資源,異常處理機(jī)制提供了 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語句強(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 語句,該語句強(qiáng)制方法返回。在通常情況下,一旦在方法里執(zhí)行到 return 語句,程序?qū)⒘⒓唇Y(jié)束該方法:現(xiàn)在不會了,雖然 return 語句也強(qiáng)制方法結(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í)行的機(jī)會。

除非在 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 等導(dǎo)致方法中止的語句(raise 語句將在后面介紹),一旦在 finally 塊中使用了 return 或 raise 語句,將會導(dǎo)致 try 塊、except 塊中的 return、raise 語句失效。看如下程序:

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

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


本文標(biāo)題:創(chuàng)新互聯(lián)Python教程:Pythonfinally-資源回收
網(wǎng)頁路徑:http://www.dlmjj.cn/article/djgecpe.html