欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

什么是Pythonfinally語句

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

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

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

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

什么是Python finally語句

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

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

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

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

No such file or directory

上面的運(yùn)行結(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í)行,這是因?yàn)?sys.exit() 方法本身就是通過引發(fā) SystemExit 異常來退出程序的。

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

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

上面程序在 finally 塊中定義了一條 return False 語句,這將導(dǎo)致 try 塊中的 return true 失去作用。運(yùn)行上面程序,將打印出 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 塊里的任何代碼。

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

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

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

廣告

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

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