目標:
- 例外的概念
- 捕獲例外
- 例外傳遞
- 自定義例外
1.例外的概念
- 在程式運行時,如果Python解釋器遇到一個錯誤,會停止程式的執行,并提示一些錯誤資訊,這就是例外
- 程式停止執行并且提示錯誤資訊 這個動作,我們通常稱之為例外

- 程式在開發時,很難將 所有的特殊情況 都處理的面面俱到,通過 例外捕獲 可以針對突發事件做集中的處理,從而保證程式的穩定性和健壯性
2.捕獲例外
2.1簡單的捕獲例外的語法
- 在程式開發中,如果對某些代碼的執行不能確定是否正確,可以增加 try(嘗試) 來捕獲例外
- 捕獲例外最簡單的語法格式:
-
try: 嘗試執行的代碼 except: 出現錯誤的處理
- try 嘗試,下方撰寫要嘗試的代碼,不確定是否能夠正常執行的代碼
- except 如果不是,下方撰寫嘗試失敗的代碼
簡單例外捕獲演練——要求用戶輸入整數
-
1 #簡單的捕獲例外 2 try: 3 a = int(input("請輸入一個整數")) 4 except: 5 print("請輸入一個正確的整數") 6 print("*"*30) 7 """ 8 運行結果: 9 請輸入一個整數5 10 ****************************** 11 12 請輸入一個整數abc 13 請輸入一個正確的整數 14 ****************************** 15 16 """
View Code
2.2錯誤型別捕獲
- 在程式執行時,可能會遇到不同型別的例外,并且 需要針對不同型別的例外,做出不同的相應,這個時候就需要捕獲錯誤型別了,
- 語法如下:
-
try: #嘗試執行的代碼 pass except 錯誤型別1: #針對錯誤型別1,對應的處理代碼 pass except 錯誤型別2: #針對錯誤型別2,對應的處理代碼 pass except Exception as result: print("未知錯誤%s" % result)
-
- 當Python解釋器拋出例外時,最后一行錯誤資訊的第一個單詞,就是錯誤型別
- 例外演練:
- 需求:
- 提示用戶輸入一個整數
- 使用8除以用戶輸入的整數并輸出
-
1 try: 2 num = int(input("請輸入一個整數,且不能為0:")) 3 a = 8 / num 4 print(a) 5 except ValueError: 6 print("請輸入正確的整數") 7 except ZeroDivisionError: 8 print("不能輸入0")
View Code
- 需求:
- 捕獲未知錯誤
- 在開發時,要預判到所有可能出現的錯誤,還是有一定難度的
- 如果希望程式,無論出現任何錯誤,都不會因為Python解釋器拋出例外為終止,可以在增加一個except Exception as result
- 演示:假如沒有考慮到除以0這種情況
-
1 try: 2 num = int(input("請輸入一個整數,且不能為0:")) 3 a = 8 / num 4 print(a) 5 except ValueError: 6 print("請輸入正確的整數") 7 except Exception as result: 8 print("未知錯誤%s" % result) 9 """ 10 運行結果: 11 請輸入一個整數,且不能為0:0 12 未知錯誤division by zero 13 """
View Code
2.3例外捕獲完整語法
- 在實際開發中,為了能夠處理復雜的例外情況,完整的例外語法如下:
-
try: #嘗試執行的代碼 pass except 錯誤型別1: #針對錯誤型別1,對應的處理代碼 pass except 錯誤型別2: #針對錯誤型別2,對應的處理代碼 pass except (錯誤型別3,錯誤型別4): #針對 錯誤型別3 和 錯誤型別4 對應的處理代碼 pass except Exception as result: print("未知錯誤%s" % result) else: #沒有例外才會執行的代碼 pass finally: #無論是否有例外,都會執行的代碼 print("無論是否有例外,都會執行的代碼")
-
else 只有在沒有例外時,才會執行的代碼
-
finally 無論是否有例外,都會執行的代碼
-
3.例外的傳遞
- 例外的傳遞——當函式/方法執行出現例外,會將例外傳遞給 函式/方法的 呼叫一方
- 如果 傳遞到主程式 任然 沒有例外處理,程式才會被終止
-
1 #例外的傳遞性 2 def fun1(): 3 return int(input("請輸入一個整數")) 4 5 def fun2(): 6 fun1() 7 8 fun2() 9 10 """ 11 請輸入一個整數a 12 Traceback (most recent call last): 13 File "D:\python_DM\venv\jiaoxue\例外\例外.py", line 8, in <module> 14 fun2() 15 File "D:\python_DM\venv\jiaoxue\例外\例外.py", line 6, in fun2 16 fun1() 17 File "D:\python_DM\venv\jiaoxue\例外\例外.py", line 3, in fun1 18 return int(input("請輸入一個整數")) 19 ValueError: invalid literal for int() with base 10: 'a' 20 傳遞順序:3 - > 6 --> 8 21 22 """
-
- 提示:
- 在開發中,可以在主函式中增加 例外捕獲
- 而在主函式中呼叫的其他函式,只要出現例外,都會傳遞到主函式的 例外捕獲 中
- 這樣就不需要在代碼中增加大量的 例外捕獲,能夠保證代碼的整潔
- 代碼演示:
-
def fun1(): return int(input("請輸入一個整數")) def fun2(): fun1() try: fun2() except Exception as result: print("未知錯誤%s"%result) """ 運行結果: 請輸入一個整數a 未知錯誤invalid literal for int() with base 10: 'a' """
-
4.拋出raise例外
4.1應用場景
- 在開發中,除了 代碼執行錯誤 Python 解釋器 拋出例外之外
- 還可以根據 應用程式 特有的業務需求 主動拋出例外
示例:
- 提示用戶 輸入密碼,如果 長度少于8,拋出例外

4.2拋出例外
- Python中提供一個Exception例外類
- 在開發時,如果滿足特定業務需求時,希望 拋出例外,可以:
- 創建 Exception 的物件
- 使用 raise 關鍵字 拋出例外
-
需求:
- 定義一個input_password函式,提示用戶輸入密碼
- 如果用戶輸入的密碼長度<8,主動拋出例外
- 如果用戶輸入的密碼長度>=8,回傳密碼
-
1 #拋出例外 2 def input_password(): 3 #提示用戶輸入密碼 4 pwd = input("請輸入密碼") 5 #判斷密碼長度是否>=8,如果大于回傳用戶輸入的密碼 6 if len(pwd) >= 8: 7 return pwd 8 #如果<8 主動拋出例外 9 #創建例外物件,可以使用錯誤資訊字串作為引數 10 ec = Exception("密碼長度不夠") 11 #主動拋出例外 12 raise ec 13 14 try: 15 print(input_password()) 16 except Exception as result: 17 print(result) 18 19 """ 20 運行結果1: 21 請輸入密碼123456 22 密碼長度不夠 23 24 運行結果2: 25 請輸入密碼123456798 26 123456798 27 """
拋出例外
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/338928.html
標籤:其他
