異常的概念
捕獲異常
異常的傳遞
拋出異常
異常的概念
程序在運行時,如果 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
解釋器 拋出異常 時,最后一行錯誤信息的第一個單詞,就是錯誤類型
異常類型捕獲演練 —— 要求用戶輸入整數
需求:
- 提示用戶輸入一個整數
- 使用
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('不管咋樣,我都要執行')
異常的傳遞
- 異常的傳遞 —— 當 函數/方法 執行 出現異常,會 將異常傳遞 給 函數/方法 的 調用一方
- 如果 傳遞到主程序,仍然 沒有異常處理,程序才會被終止
提示:
- 在開發中,可以在主函數中增加 異常捕獲
- 而在主函數中調用的其他函數,只要出現異常,都會傳遞到主函數的 異常捕獲 中
- 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔
需求
- 定義函數
demo1()
提示用戶輸入一個整數並且返回 - 定義函數
demo2()
調用demo1()
- 在主程序中調用
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
異常類- 在開發時,如果滿足 特定業務需求時,希望 拋出異常,可以:
- 創建 一個
Exception
的 對象 - 使用
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)