中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

什么是Python finally語句

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

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

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

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

什么是Python finally語句

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

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

Python 完整的異常處理語法結構如下:

try:
    #業務實現代碼
except SubException as e:
    #異常處理塊1
    ...
except SubException2 as e:
    #異常處理塊2
    ...
else:
    #正常處理塊
finally :
    #資源回收塊
    ...

在異常處理語法結構中,只有 try 塊是必需的,也就是說:如果沒有 try 塊,則不能有后面的 except 塊和 finally 塊;except 塊和 finally 塊都是可選的,但 except 塊和 finally 塊至少出現其中之一,也可以同時出現;可以有多個 except 塊,但捕獲父類異常的 except 塊應該位于捕獲子類異常的 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:
        # 關閉磁盤文件,回收資源
        if fis is not None:
            try:
                # 關閉資源
                fis.close()
            except OSError as ioe:
                print(ioe.strerror)
        print("執行finally塊里的資源回收!")
test()

上面程序在 try 塊后增加了 finally 塊,用于回收在 try 塊中打開的物理資源。注意在程序的 except 塊中 ① 處有一條 return 語句,該語句強制方法返回。在通常情況下,一旦在方法里執行到 return 語句,程序將立即結束該方法:現在不會了,雖然 return 語句也強制方法結束,但一定會先執行 finally 塊的代碼。 

運行上面程序,將看到如下運行結果:

No such file or directory
執行finally里的資源回收!

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

No such file or directory

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

除非在 try 塊、except 塊中調用了退出 Python 解釋器的方法,否則不管在 try 塊、except 塊中執行怎樣的代碼,出現怎樣的情況,異常處理的 finally 塊總會被執行。調用 sys.exit() 方法退出程序不能阻止 finally 塊的執行,這是因為 sys.exit() 方法本身就是通過引發 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 的結果。
如果 Python 程序在執行 try 塊、except 塊時遇到了 return 或 raise 語句,這兩條語句都會導致該方法立即結束,那么系統執行這兩條語句并不會結束該方法,而是去尋找該異常處理流程中的 finally 塊,如果沒有找到 finally 塊,程序立即執行 return 或 raise 語句,方法中止;如果找到 finally 塊,系統立即開始執行 finally 塊,只有當 finally 塊執行完成后,系統才會再次跳回來執行 try 塊、except 塊里的 return 或 raise 語句;如果在 finally 塊里也使用了 return 或 raise 等導致方法中止的語句,finally 塊己經中止了方法,系統將不會跳回去執行 try 塊、except 塊里的任何代碼。

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

向AI問一下細節

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

AI

信宜市| 乌苏市| 天祝| 安乡县| 凤翔县| 平陆县| 阳信县| 阿城市| 永寿县| 景德镇市| 五家渠市| 长乐市| 塘沽区| 屏山县| 唐海县| 随州市| 马龙县| 刚察县| 霍山县| 遵义县| 三穗县| 麻阳| 卢湾区| 通山县| 常德市| 梓潼县| 盐亭县| 从化市| 桑植县| 铁力市| 延边| 鄂州市| 建昌县| 台南县| 梅州市| 长宁区| 定安县| 四会市| 鸡东县| 中方县| 三江|