python異常(概念、捕獲、傳遞、拋出)

異常

目標

  • 異常的概念
  • 捕獲異常
  • 異常的傳遞
  • 拋出異常

01. 異常的概念

  • 程序在運行時,若是 Python 解釋器 遇到 到一個錯誤,會中止程序的執行,而且提示一些錯誤信息,這就是 異常
  • 程序中止執行而且提示錯誤信息 這個動做,咱們一般稱之爲:拋出(raise)異常

001_異常示意圖python

程序開發時,很難將 全部的特殊狀況 都處理的面面俱到,經過 異常捕獲 能夠針對突發事件作集中的處理,從而保證程序的 穩定性和健壯性函數

02. 捕獲異常

2.1 簡單的捕獲異常語法

  • 在程序開發中,若是 對某些代碼的執行不能肯定是否正確,能夠增長 try(嘗試) 來 捕獲異常
  • 捕獲異常最簡單的語法格式:
try: 嘗試執行的代碼 except: 出現錯誤的處理 
  • try 嘗試,下方編寫要嘗試代碼,不肯定是否可以正常執行的代碼
  • except 若是不是,下方編寫嘗試失敗的代碼

簡單異常捕獲演練 —— 要求用戶輸入整數

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

2.2 錯誤類型捕獲

  • 在程序執行時,可能會遇到 不一樣類型的異常,而且須要 針對不一樣類型的異常,作出不一樣的響應,這個時候,就須要捕獲錯誤類型了學習

  • 語法以下:spa

try: # 嘗試執行的代碼 pass except 錯誤類型1: # 針對錯誤類型1,對應的代碼處理 pass except (錯誤類型2, 錯誤類型3): # 針對錯誤類型2 和 3,對應的代碼處理 pass except Exception as result: print("未知錯誤 %s" % result) 
  • 當 Python 解釋器 拋出異常 時,最後一行錯誤信息的第一個單詞,就是錯誤類型

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

需求code

  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) 

2.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("執行完成,可是不保證正確") 

03. 異常的傳遞

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

提示input

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

需求

  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) 

04. 拋出 raise 異常

4.1 應用場景

  • 在開發中,除了 代碼執行出錯 Python 解釋器會 拋出 異常以外
  • 還能夠根據 應用程序 特有的業務需求 主動拋出異常

示例

  • 提示用戶 輸入密碼,若是 長度少於 8,拋出 異常

024_自定義異常

注意

  • 當前函數 只負責 提示用戶輸入密碼,若是 密碼長度不正確,須要其餘的函數進行額外處理
  • 所以能夠 拋出異常,由其餘須要處理的函數 捕獲異常

4.2 拋出異常

  • 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) 
相關文章
相關標籤/搜索