python 約束與異常處理
一、類的約束
1、約束就是對類的約束。其實就是父類對子類進行約束,子類必須要寫xxx方法。
2、抽象:就是當我們沒法對一個功能或者一個屬性進行精確的表述,一般都採用抽象的方式給出。
(1)抽象類的書寫規範
from abc import ABCMeta,abstractmethod # 引入抽象方法的模組 class Base(metaclass=ABCMeta): #定義抽象類 maetaclass=ABCmeta @abstractmethod#抽象方法的關鍵字 def 方法(self): pass
(2)抽象類相關的知識點:
a:一個類包含抽象方法,一定屬於抽象類
b:抽象類,可以包含正常的方法(例項方法、類方法、靜態方法)
c:抽象類不能建立物件
d:如果子類未對父類的抽象方法進行重寫,該類也是一個抽象類,無法建立物件
f:介面,類中全都是抽象方法
from abc import ABCMeta,abstractmethod # 引入抽象方法的模組 class Base(metaclass=ABCMeta): #定義抽象類 maetaclass=ABCmeta @abstractmethod#抽象方法的關鍵字 defhe(self): pass def chi(self): print("吃什麼") class Foo(Base): def shui(self): print ("睡你麻痺") f=Foo()#Can't instantiate abstract class Foo with abstract methods he f.shui() # 只要類包含了抽象方法就不能建立物件
2、python中約束有的兩種方式:(貼吧登陸)
(1)使用抽象類和抽象方法
from abc import ABCMeta,abstractmethodclass Base(metaclass=ABCMeta): @abstractmethod #定義一個抽象的login方法 def login(self): pass class Normal(Base): def login(self): print("普通使用者登入") class Memer(Base): def login(self): print("吧務登陸") class Admin(Base): def login(self): print("管理員登入")
(2)使用丟擲異常,並且丟擲的異常時NotImplementError。這樣比較專業,並且錯誤比較明確。
#如果子類沒有重寫父類的方法,執行了父類的方法則丟擲異常 class Base: def login(self): raise NotImplementedError("你沒有重寫該方法,滾回去重寫") class Normal(Base): def login(self): print("普通使用者登入") # class Memer(Base): # def login(self): # print("吧務登陸") class Memer(Base): pass class Admin(Base): def login(self): print("管理員登入") n=Normal() m=Memer() a=Admin() n.login() m.login()#NotImplementedError: 你沒有重寫該方法,滾回去重寫 a.login()
二、異常處理
1、格式:
try: '''進行操作''' except Exception as e:#Exception是異常的父類,可以捕獲所有的異常 '''捕獲異常後,給予提示語''' else: '''try中沒有出現錯誤,執行這裡的操作''' finally: '''不管出不出錯都會執行這裡的操作'''
解讀:程式先執行try中的操作,如果出錯了,就會走到except裡面,進行相應的操作,如果沒有出錯,就直接執行else裡面的操作,不管出不出錯都會執行最後的finally.
2、丟擲異常
(1)關鍵字 raise
def cul(a,b): if (type(a)==int or type(a)==float)and (type(b)==int or type(b)==float): return a+b else: raise Exception("請給我int或者float")#丟擲異常,異常Exception ret=cul(3,"麻辣燙")#Exception: 請給我int或者float
(2)自定義異常
實現:定義一個異常繼承Exception就可以實現自定義異常了(Exception是異常的基類,)
class GenderException(Exception):#定義了一個性別異常 pass class Person: def __init__(self,name,gender): self.name=name self.gender=gender def got_nan_yushi(self): ''' x洗澡 :return: ''' if self.gender=="男": print("歡迎光臨") else: raise GenderException("性別錯了") #丟擲自定義異常
3、異常處理
(1)處理除數不能是0的異常
# ZeroDivisionError try: #把需要處理的物件放入其中 print(10/0) except ZeroDivisionError as e: print("0不能做除數") # 異常處理結果顯示:0不能做除數
(2)獲取錯誤資訊 :traceback (目的主要是方便程式設計師排查錯誤)
import traceback #插入堆疊模組 # traceback這個模組可以獲取到我們每個⽅法的呼叫資訊 try: #把需要處理的物件放入其中 print(10/0) except ZeroDivisionError as e: val=traceback.format_exc()#獲取堆疊資訊 print("0不能做除數") print() print(val) # 異常處理結果顯示:0不能做除數
結果: 0不能做除數 Traceback (most recent call last): File "E:/qishi/Day19 約束/04異常處理.py", line 79, in <module> print(10/0) ZeroDivisionError: division by zero
三、日記處理
1、基本步驟
1. 匯入logging模組.
2. 簡單配置⼀下logging
3. 出現異常的時候(except). 向⽇志⾥寫錯誤資訊
2、配置資訊如下
logging.basicConfig(filename='x1.txt',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=10) # 當前配置表示 10以上的分數會被寫⼊⽂件
# # 日記 # 1、匯入logging模組 # 2、簡單配置;一下logging # 3、出現異常的時候,向日記裡面寫錯誤資訊 import logging import traceback # filename: ⽂件名 # format: 資料的格式化輸出. 最終在⽇志⽂件中的樣⼦ # 時間-名稱-級別-模組: 錯誤資訊 # datefmt: 時間的格式 # level: 錯誤的級別權重, 當錯誤的級別權重⼤於等於leval的時候才會寫⼊⽂件 logging.basicConfig(filename='x1.txt', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=20) # 當前配置表示 10以上的分數會被寫⼊⽂件 # CRITICAL = 50 # FATAL = CRITICAL # ERROR = 40 # WARNING = 30 # WARN = WARNING # INFO = 20 # DEBUG = 10 # NOTSET = 0 # logging.critical("我是critical") # 50分. 最貴的 # logging.error("我是error") # 40分logging.warning("我是警告") # 警告 30 # logging.info("我是基本資訊") # 20 # logging.debug("我是除錯") # 10 # logging.log(2, "我是⾃定義") # ⾃定義. 看著給分 try: ret=10/0 except ZeroDivisionError as e: print("正在寫入日記") logging.error(traceback.format_exc()) print("寫入完畢")
3、例項:產生10個錯誤,記錄下來
import logging import traceback
logging.basicConfig(filename='x1.txt', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=20) # 當前配置表示 20以上的分數會被寫⼊⽂件 class JackError(Exception):#自定義異常 pass for i in range(10): try: if i%3==0: raise FileExistsError("檔案不在押") elif i%3==1: raise KeyError("按錯了") else: raise JackError("Jack錯了") except FileExistsError as e: val=traceback.format_exc() logging.error(val) print("檔案丟失") except KeyError as e: val=traceback.format_exc() logging.error(val) print("瞎jb按") except JackError as e: val=traceback.format_exc() logging.error(val) except Exception: val=traceback.format_exc() logging.error(val) print("其他錯誤")
log檔案
2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 44, in <module> raise FileExistsError("檔案不在押") FileExistsError: 檔案不在押 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 46, in <module> raise KeyError("按錯了") KeyError: '按錯了' 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 48, in <module> raise JackError("Jack錯了") JackError: Jack錯了 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 44, in <module> raise FileExistsError("檔案不在押") FileExistsError: 檔案不在押 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 46, in <module> raise KeyError("按錯了") KeyError: '按錯了' 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 48, in <module> raise JackError("Jack錯了") JackError: Jack錯了 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 44, in <module> raise FileExistsError("檔案不在押") FileExistsError: 檔案不在押 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 46, in <module> raise KeyError("按錯了") KeyError: '按錯了' 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 48, in <module> raise JackError("Jack錯了") JackError: Jack錯了 2018-11-12 18:43:50 - root - ERROR -日記: Traceback (most recent call last): File "E:/qishi/Day19 約束/日記.py", line 44, in <module> raise FileExistsError("檔案不在押") FileExistsError: 檔案不在押