Python異常處理中很是容易犯的錯誤

這是我參與更文挑戰的第14天,活動詳情查看: 更文挑戰python

整理異常處理中finally的兩個容易犯的錯誤。markdown

Python異常處理機制

exception.jpeg

若是try異常處理中存在finally,finally中的代碼總會獲得執行函數

下面例子只是做爲演示,不用去糾結業務邏輯oop

容易犯的錯誤1

看下面的代碼,寫出輸出結果post

def dig_dig1():
    while True:
        print("I'm in while loop")
        try:
            print("I'm in try")
            raise EOFError
        except IOError:
            print("IOEoor")
        finally:
            print("I'm in finally")
            break


dig_dig1()
複製代碼

原覺得會輸出的結果:ui

I'm in while loop
I'm in try
I'm in finally
EOFError

Process finished with exit code 1
複製代碼

運行結果spa

I'm in while loop
I'm in try
I'm in finally

Process finished with exit code 0
複製代碼
  1. 若是異常處理中存在finally, finally總會被執行;
  2. 那麼在執行finally以前,try中的產生的異常將會被臨時保存起來,當finally的代碼執行完成後,再拋出異常;
  3. 但當finally中存在raise或return或break時, try中的異常將會被拋棄。

容易犯的錯誤2

看下面的代碼,寫出輸出結果code

def dig_dig2(index):
    try:
        print("I'm in try")
        if index < 0:
            raise IndexError
        else:
            return index
    except IndexError:
        print("I'm in except")
        return "except"
    finally:
        print("I'm in finally")
        return "finally"


print(dig_dig2(12))
複製代碼

原覺得會輸出的結果:orm

I'm in try
12
複製代碼

運行結果get

I'm in try
I'm in finally
finally

Process finished with exit code 0
複製代碼
  1. 若是異常處理中存在finally, finally總會被執行。

  2. 若是在try塊語句中存在return的同時又存在finally塊語句,那麼將會在執行try塊語句中return語句以前去執行finally語句塊,而後再回來執行try塊語句中return語句。

  3. 可是例子中在finally塊語句中存在return語句,整個函數已結束,因此try塊語句中return語句將永遠得不到執行。

總結

通常狀況下,若是異常處理中存在finally, finally總會被執行。可是,存在如下狀況就須要注意:

  1. 在執行finally以前,try中的產生的異常將會被臨時保存起來,當finally的代碼執行完成後,再拋出異常; 但當finally中存在raise或return或break時, try中的異常將會被拋棄。
  2. 若是在try塊語句中存在return的同時又存在finally塊語句,那麼將會在執行try塊語句中return語句以前去執行finally語句塊,而後再回來執行try塊語句中return語句。可是在finally塊語句中存在return語句,整個函數已結束,因此try塊語句中return語句將永遠得不到執行。
相關文章
相關標籤/搜索