1. 程式人生 > >python 約束與異常處理

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#抽象方法的關鍵字
    def
he(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,abstractmethod
class 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: 檔案不在押