一、內(nèi)容總覽
- 1.1、異常的概念
- 1.2、捕獲異常
- 1.3、異常的傳遞
- 1.4、拋出異常
二、異常的概念
- 2.1、程序在運(yùn)行時,如果
Python 解釋器遇到 到一個錯誤,會停止程序的執(zhí)行,并且提示一些錯誤信息,這就是 異常 - 2.2、程序停止執(zhí)行并且提示錯誤信息 這個動作,我們通常稱之為:拋出(
raise)異常
異常示意圖程序開發(fā)時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕獲 可以針對突發(fā)事件做集中的處理,從而保證程序的 穩(wěn)定性和健壯性
三、捕獲異常
-
3.1、 簡單的捕獲異常語法
在程序開發(fā)中,如果 對某些代碼的執(zhí)行不能確定是否正確,可以增加
try(嘗試)來 捕獲異常-
捕獲異常最簡單的語法格式:
try: 嘗試執(zhí)行的代碼 except: 出現(xiàn)錯誤的處理 try 嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執(zhí)行的代碼
except 如果try里面的代碼出現(xiàn)錯誤,就會走except下面的代碼,并且整個程序的代碼正常執(zhí)行
-
如下面簡單的例子: 要求用戶輸入整數(shù)(如果用戶輸入的不是整數(shù),就會走
except下面 )try: # 代碼的執(zhí)行不能確定是否正確 num = int(input("請輸入整數(shù):")) except: # 錯誤的代碼處理 print("請輸入正確的整數(shù)") print("#"*50)
-
3.2、錯誤類型捕獲
在程序執(zhí)行時,可能會遇到 不同類型的異常,并且需要 針對不同類型的異常,做出不同的響應(yīng),這個時候,就需要捕獲錯誤類型了
-
語法如下:
try: # 嘗試執(zhí)行的代碼 pass except 錯誤類型1: # 針對錯誤類型1,對應(yīng)的代碼處理 pass except (錯誤類型2, 錯誤類型3): # 針對錯誤類型2 和 3,對應(yīng)的代碼處理 pass except Exception as result: print("未知錯誤 %s" % result) -
當(dāng) Python 解釋器 拋出異常 時,最后一行錯誤信息的第一個單詞,就是錯誤類型
最后一行錯誤信息的第一個單詞,就是錯誤類型* -
異常類型捕獲演練 —— 要求用戶輸入整數(shù)
-
需求:1、提示用戶輸入一個整數(shù);2、使用
8除以用戶輸入的整數(shù)并且輸出try: num = int(input("請輸入整數(shù):")) result = 8 / num print(result) except ValueError: print("請輸入正確的整數(shù)") except Exception as result: # 不知道錯誤類型是什么 print("錯誤信息是 %s" % result) print("#"*50)
-
-
捕獲未知錯誤
在開發(fā)時,要預(yù)判到所有可能出現(xiàn)的錯誤,還是有一定難度的
-
如果希望程序 無論出現(xiàn)任何錯誤,都不會因?yàn)?
Python解釋器 拋出異常而被終止,可以再增加一個except,語法如下:result是錯誤的信息except Exception as result: print("未知錯誤 %s" % result)
-
3.3、異常捕獲完整語法
-
在實(shí)際開發(fā)中,為了能夠處理復(fù)雜的異常情況,完整的異常語法如下
try: # 嘗試執(zhí)行的代碼 pass except 錯誤類型1: # 針對錯誤類型1,對應(yīng)的代碼處理 pass except 錯誤類型2: # 針對錯誤類型2,對應(yīng)的代碼處理 pass except (錯誤類型3, 錯誤類型4): # 針對錯誤類型3 和 4,對應(yīng)的代碼處理 pass except Exception as result: # 打印錯誤信息 print(result) else: # 沒有異常才會執(zhí)行的代碼 pass finally: # 無論是否有異常,都會執(zhí)行的代碼 print("無論是否有異常,都會執(zhí)行的代碼") else只有在沒有異常時才會執(zhí)行的代碼finally無論是否有異常,都會執(zhí)行的代碼
-
四、異常的傳遞
- 4.1、異常的傳遞 —— 當(dāng) 函數(shù)/方法 執(zhí)行 出現(xiàn)異常,會 將異常傳遞 給 函數(shù)/方法 的 調(diào)用一方
- 4.2、如果 傳遞到主程序,仍然 沒有異常處理,程序才會被終止
提示:
- 在開發(fā)中,可以在主函數(shù)中增加 異常捕獲
- 而在主函數(shù)中調(diào)用的其他函數(shù),只要出現(xiàn)異常,都會傳遞到主函數(shù)的 異常捕獲 中
- 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔
-
4.3、看下面的示例:主程序調(diào)用 demo2,demo2又去調(diào)用demo1,當(dāng)demo1里面出現(xiàn)異常的時候,會把異常傳給demo2,demo2又會傳給主程序
def demo1(): return int(input("請輸入一個整數(shù):")) def demo2(): return demo1() try: print(demo2()) except ValueError: print("請輸入正確的整數(shù)") except Exception as result: print("未知錯誤 %s" % result)
五、拋出 raise 異常
-
5.1、應(yīng)用場景
- 在開發(fā)中,除了 代碼執(zhí)行出錯 Python 解釋器會 拋出 異常之外
- 還可以根據(jù) 應(yīng)用程序 特有的業(yè)務(wù)需求 主動拋出異常
- 示例
-
提示用戶 輸入密碼,如果 長度少于 8,拋出 異常
自定義異常
-
- 注意:
- 當(dāng)前函數(shù) 只負(fù)責(zé) 提示用戶輸入密碼,如果 密碼長度不正確,需要其他的函數(shù)進(jìn)行額外處理
- 因此可以 拋出異常,由其他需要處理的函數(shù) 捕獲異常
-
5.2、主動拋出異常
Python 中提供了一個 Exception 異常類
-
在開發(fā)時,如果滿足 特定業(yè)務(wù)需求時,希望 拋出異常,可以:
創(chuàng)建 一個
Exception的 對象-
使用
raise關(guān)鍵字 拋出 異常對象# 創(chuàng)建異常對象 ex = Exception("異常提示信息,自己寫") # 使用 raise 拋出異常對象 raise ex
-
需求
- 定義 input_password 函數(shù),提示用戶輸入密碼
- 如果用戶輸入長度 < 8,拋出異常
- 如果用戶輸入長度 >=8,返回輸入的密碼
-
代碼如下:
def input_password(): # 1、提示用戶輸入密碼 password = input("請輸入密碼:") # 2、密碼長度大于8 返回密碼 if len(password) > 8: return password # 3、密碼長度不夠,需要拋出異常 # 1> 創(chuàng)建異常對象 - 使用異常的錯誤信息字符串作為參數(shù) ex = Exception("密碼長度不夠") # 2、使用 raise 拋出異常對象 raise ex try: print(input_password()) except Exception as result: print("錯誤信息是:%s"% result)


