1.異常的定義 *****2.異常的分類3.異常的組成4.常見異常5.異常的處理 *****6.主動拋出異常 raise關鍵字7.斷言8.自定義異常 as關鍵字9.總結 使用場景"""什麼是異常? 異常是錯誤發生前的一種信號 若是沒有人來處理這個信號 程序就會中斷執行並拋出錯誤信息異常的分類: 1.語法異常 若是是編譯器 會自動提示 若是是文本編輯器 在你運行代碼前 解釋器會檢查語法 2.運行時異常(邏輯異常) 這種異常只有在代碼被執行時才能發現 1. 當咱們能夠預知程序發生錯誤的條件,應該用if判斷去規避錯誤 AGE=10 age=input('>>: ').strip() if age.isdigit(): age=int(age) if age > AGE: print('too big') else: print('必須輸入數字') 2. 當咱們沒法預知程序發生錯誤的條件,也就是說錯誤必定會發生,那麼咱們應該 try..except去補救異常的組成 1.追蹤信息 (具體發生異常的位置 以及函數的調用順序) 2.異常的類型 (錯誤的類型) 3.異常的消息 (詳細的錯誤信息)排除錯誤時 先查看異常類型和詳細信息 最後根據追蹤信息找到發生的位置進行修改咱們之因此學習異常處理 爲的是讓咱們的程序更加穩定 (健壯性) 不容易崩潰多種異常類型處理萬能異常類型 except Exception 或BaseException 基於OOP的繼承和多態raise主動拋出異常 raise 異常類型(消息) 類型必須是Exception的子類 當用戶使用時沒有按照規範使用 常和if連用,做爲if的結果 raise TypeError("你輸入的不是整型!")assert斷言 一個條件跟表達式 結果必須是bool類型 後續的功能須要前面的某個條件成立 才能執行 if len(li) < 1: raise ValueError("列表中沒有數據!") 等同於assert len(li) > 0 assert 就是爲了簡化代碼,可是沒有具體的自定義消息自定義異常類 系統提供的異常類 和咱們想要買描述的錯誤 不匹配時 語法:用一個class 繼承BaseException class UnlikeError(BaseException): def __init__(self,msg): self.msg = msg # except UnlikeError as e: #e做爲異常錯誤的對象 # print(e.text)使用finally:不管是否發生異常 都會執行finally 能夠用來回收系統資源!finally: print("關閉文件!") f.close()使用場景: 沒法預知錯誤發生的緣由時 或者知道爲何可是程序沒法解決時不該該濫用try except (亂用會致使代碼能夠讀變差) 何時用? 若是你知道爲何出錯 應該把代碼修改正確 而不是加上try except 你不清楚爲何會發生異常! 這時候用try""""""語法:try: 被檢測的子代碼塊except 異常類型1 as e:(e是別名,爲了訪問異常對象裏的內容) 匹配成功異常類型1,執行的子代碼塊except 異常類型2 as e: 匹配成功異常類型2,執行的子代碼塊except 異常類型3 as e: 匹配成功異常類型3,執行的子代碼塊...except Exception(BaseException) as e: 萬能異常else: 被檢測的子代碼塊沒有發生異常時執行的代碼塊finally: 沒法被檢測的子代碼塊有無異常發生,都會執行, 一般應該在這裏進行回收資源的操做"""""" 常見的發生緣由: NameError 找不到這個名字 要麼變量 要麼函數 ValueError 在調用一個函數時給的的值不正確 TypeError 類型錯誤 例如字符串與數字加減乘除 調用一個不能被調用的類型 ZeroDivisionError 除數不能爲0 KeyError 沒有這個key IndexError 索引不存在 StopIteration 沒有更多的值能夠迭代 FileNotFoundError 文件不存在 io.UnsupportedOperation 文件的操做不支持 AttributeError 沒有這個屬性 KeyboardInterrupt 程序被強行終止 ctrl+c"""多種異常類型處理print("staring.....")try: # name # [][-1] 1/0 passexcept NameError: print("名字找不到!")except IndexError: print("索引超出範圍")except ZeroDivisionError: print("除數不能爲0")print("end.......")當代碼可能出現多種異常時的寫法2except (NameError,IndexError,ZeroDivisionError):上面兩種寫法 均可以處理多種異常 可是 異常類型太多了 不可能全寫完萬能異常類型 Exception 或BaseException 基於OOP的繼承和多態print("staring.....")try: {}["aaa"] name [][-1] 1/0except Exception: print("可能名字找不到! 可能因此超出範圍 可能除數爲0")print("end.......")使用finally來回收資源try: f = open(r"D:\上海python全棧4期\day31\異常處理\1今日內容","rt",encoding="utf-8") f.read() # f.write("123")except Exception: print("發生異常了")finally: print("關閉文件!") f.close()print(f.closed)""" raise主動拋出異常 當程序中有一些限制 然而用戶沒有遵照 咱們能夠主動拋出異常 語法: raise 異常類型(異常的詳細信息) 類型必須是BaseException的子類"""age = input("請輸入整型的年齡:")if not age.isdigit(): raise TypeError("你輸入的不是整型!")age = int(age)print("十年後你%s歲" % (age + 10))""" assert斷言 能夠理解判定 就是很清楚 很明確 何時須要判定? 下面的代碼必須依賴上面代碼的正確數據 語法: assert 結果爲Bool的表達式 若是值爲True 則繼續往下執行 爲False 拋出一個 AssertionError 表示斷言失敗 沒有assert 也可使用if來玩 assert 僅僅是簡化了代碼"""第一部分代碼 負責產生一個列表li = []li.append(1)li.append(2)這裏必定要確保數據是有效的if len(li) < 1: raise ValueError("列表中沒有數據!")assert len(li) > 0須要使用列表中的數據來完成任務 若是沒有數據沒法完成print(li[0])print(li[0])print(li[0])""" 當系統提供的這些異常類型 和你要描述的錯誤不匹配時 就須要自定義異常類型 寫法: class 自定義異常類型名稱(BaseException): 總結一下:之因此自定義異常類型 是爲了更具體描述你的錯誤 讓使用者一眼就看出了 關鍵點:1.如何自定義異常類型 2.在except中 使用as 來獲取異常對象""" 你隨便輸入一句話 看我喜不喜歡 不喜歡我就拋出異常自定義異常類class UnlikeError(BaseException): def __init__(self,msg): self.msg = msgtext = input("輸入一段話:")if text == "你真帥": print("你說得對!")else: raise UnlikeError("你再看看...")class UnlikeError(BaseException): def __init__(self,msg,text): self.msg = msg self.text = text# 函數中可能拋出異常def hello(): text = input("輸入一段話:") if text == "你真帥": print("你說得對!") else: raise UnlikeError("你再看看...","另外一個參數")# 捕獲異常try: hello()# 獲取異常對象except UnlikeError as e: print(e.text)