Python(八) —— 異常(概念、捕獲、傳遞、拋出)


異常的概念

捕獲異常

異常的傳遞

拋出異常

異常的概念

程序在運行時,如果 Python 解釋器 遇到 到一個錯誤,會停止程序的執行,並且提示一些錯誤信息,這就是 異常

程序停止執行並且提示錯誤信息 這個動作,我們通常稱之為:拋出(raise)異常

捕獲異常

1、簡單的捕獲異常語法

在程序開發中,如果 對某些代碼的執行不能確定是否正確,可以增加 try(嘗試) 來 捕獲異常

捕獲異常最簡單的語法格式

try:
    嘗試執行的代碼
except:
    出現錯誤的處理
  • try 嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執行的代碼
  • except 如果不是,下方編寫嘗試失敗的代碼

例如:

要求用戶輸入整數

try:
    # 提示用戶輸入一個數字
    num = int(input("請輸入數字:"))
except:
    print("請輸入正確的數字")

 

2、錯誤類型捕獲

在程序執行時,可能會遇到 不同類型的異常,並且需要 針對不同類型的異常,做出不同的響應,這個時候,就需要捕獲錯誤類型了

語法如下:

try:
    # 嘗試執行的代碼
    pass
except 錯誤類型1:
    # 針對錯誤類型1,對應的代碼處理
    pass
except (錯誤類型2, 錯誤類型3):
    # 針對錯誤類型2 和 3,對應的代碼處理
    pass
except Exception as result:
    print("未知錯誤 %s" % result)

當 Python 解釋器 拋出異常 時,最后一行錯誤信息的第一個單詞,就是錯誤類型

異常類型捕獲演練 —— 要求用戶輸入整數

需求:

  1. 提示用戶輸入一個整數
  2. 使用 8 除以用戶輸入的整數並且輸出
try:
    num = int(input("請輸入整數:"))
    result = 8 / num
    print(result)
except ValueError:
    print("請輸入正確的整數")
except ZeroDivisionError:
    print("除 0 錯誤")

捕獲未知錯誤

  • 在開發時,要預判到所有可能出現的錯誤,還是有一定難度的
  • 如果希望程序 無論出現任何錯誤,都不會因為 Python 解釋器 拋出異常而被終止,可以再增加一個 except

語法如下:

except Exception as result:
    print("未知錯誤 %s" % result)

 

3、異常捕獲完整語法

在實際開發中,為了能夠處理復雜的異常情況,完整的異常語法如下:

try:
    # 嘗試執行的代碼
    pass
except 錯誤類型1:
    # 針對錯誤類型1,對應的代碼處理
    pass
except 錯誤類型2:
    # 針對錯誤類型2,對應的代碼處理
    pass
except (錯誤類型3, 錯誤類型4):
    # 針對錯誤類型3 和 4,對應的代碼處理
    pass
except Exception as result:
    # 打印錯誤信息
    print(result)
else:
    # 沒有異常才會執行的代碼
    pass
finally:
    # 無論是否有異常,都會執行的代碼
    print("無論是否有異常,都會執行的代碼")
  • else 只有在沒有異常時才會執行的代碼
  • finally 無論是否有異常,都會執行的代碼

之前一個演練的 完整捕獲異常 的代碼如下:

try:
    num = int(input("請輸入整數:"))
    result = 8 / num
    print(result)
except ValueError:
    print("請輸入正確的整數")
except ZeroDivisionError:
    print("除 0 錯誤")
except Exception as result:
    print("未知錯誤 %s" % result)
else:
    print("正常執行")
finally:
    print("執行完成,但是不保證正確")

 簡單方式看看:

try:
    a = 5/0
    print(a)
except Exception  as e:
    print('出現異常,執行我')
else:
    print('沒有出現異常,執行我')
finally:
    print('不管咋樣,我都要執行')

 

異常的傳遞

  • 異常的傳遞 —— 當 函數/方法 執行 出現異常,會 將異常傳遞 給 函數/方法 的 調用一方
  • 如果 傳遞到主程序,仍然 沒有異常處理,程序才會被終止

提示:

  • 在開發中,可以在主函數中增加 異常捕獲
  • 而在主函數中調用的其他函數,只要出現異常,都會傳遞到主函數的 異常捕獲 中
  • 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔

需求

  1. 定義函數 demo1() 提示用戶輸入一個整數並且返回
  2. 定義函數 demo2() 調用 demo1()
  3. 在主程序中調用 demo2()
def demo1():
    return int(input("請輸入一個整數:"))


def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print("請輸入正確的整數")
except Exception as result:
    print("未知錯誤 %s" % result)

拋出 raise 異常

應用場景

  • 在開發中,除了 代碼執行出錯 Python 解釋器會 拋出 異常之外
  • 還可以根據 應用程序 特有的業務需求 主動拋出異常
  • 也就是自己定義一個異常

拋出異常

  • Python 中提供了一個 Exception 異常類
  • 在開發時,如果滿足 特定業務需求時,希望 拋出異常,可以:
    1. 創建 一個 Exception 的 對象
    2. 使用 raise 關鍵字 拋出 異常對象

需求

  • 定義 input_password 函數,提示用戶輸入密碼
  • 如果用戶輸入長度 < 8,拋出異常
  • 如果用戶輸入長度 >=8,返回輸入的密碼
def input_password():

    # 1. 提示用戶輸入密碼
    pwd = input("請輸入密碼:")

    # 2. 判斷密碼長度,如果長度 >= 8,返回用戶輸入的密碼
    if len(pwd) >= 8:
        return pwd

    # 3. 密碼長度不夠,需要拋出異常
    # 1> 創建異常對象 - 使用異常的錯誤信息字符串作為參數
    ex = Exception("密碼長度不夠")

    # 2> 拋出異常對象
    raise ex


try:
    user_pwd = input_password()
    print(user_pwd)
except Exception as result:
    print("發現錯誤:%s" % result)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM