python 约束与异常处理
一、類(lèi)的約束
1、約束就是對(duì)類(lèi)的約束。其實(shí)就是父類(lèi)對(duì)子類(lèi)進(jìn)行約束,子類(lèi)必須要寫(xiě)xxx方法。
2、抽象:就是當(dāng)我們沒(méi)法對(duì)一個(gè)功能或者一個(gè)屬性進(jìn)行精確的表述,一般都采用抽象的方式給出。
(1)抽象類(lèi)的書(shū)寫(xiě)規(guī)范
from abc import ABCMeta,abstractmethod # 引入抽象方法的模塊class Base(metaclass=ABCMeta): #定義抽象類(lèi) maetaclass=ABCmeta@abstractmethod#抽象方法的關(guān)鍵字def 方法(self):pass(2)抽象類(lèi)相關(guān)的知識(shí)點(diǎn):
a:一個(gè)類(lèi)包含抽象方法,一定屬于抽象類(lèi)
b:抽象類(lèi),可以包含正常的方法(實(shí)例方法、類(lèi)方法、靜態(tài)方法)
c:抽象類(lèi)不能創(chuàng)建對(duì)象
d:如果子類(lèi)未對(duì)父類(lèi)的抽象方法進(jìn)行重寫(xiě),該類(lèi)也是一個(gè)抽象類(lèi),無(wú)法創(chuàng)建對(duì)象
f:接口,類(lèi)中全都是抽象方法
from abc import ABCMeta,abstractmethod # 引入抽象方法的模塊class Base(metaclass=ABCMeta): #定義抽象類(lèi) maetaclass=ABCmeta@abstractmethod#抽象方法的關(guān)鍵字def he(self):passdef chi(self):print("吃什么")class Foo(Base):def shui(self):print ("睡你麻痹") f=Foo()#Can't instantiate abstract class Foo with abstract methods he f.shui() # 只要類(lèi)包含了抽象方法就不能創(chuàng)建對(duì)象
2、python中約束有的兩種方式:(貼吧登陸)
(1)使用抽象類(lèi)和抽象方法
from abc import ABCMeta,abstractmethod class Base(metaclass=ABCMeta):@abstractmethod #定義一個(gè)抽象的login方法def login(self):pass class Normal(Base):def login(self):print("普通用戶(hù)登錄") class Memer(Base):def login(self):print("吧務(wù)登陸") class Admin(Base):def login(self):print("管理員登錄")(2)使用拋出異常,并且拋出的異常時(shí)NotImplementError。這樣比較專(zhuān)業(yè),并且錯(cuò)誤比較明確。
#如果子類(lèi)沒(méi)有重寫(xiě)父類(lèi)的方法,執(zhí)行了父類(lèi)的方法則拋出異常 class Base:def login(self):raise NotImplementedError("你沒(méi)有重寫(xiě)該方法,滾回去重寫(xiě)") class Normal(Base):def login(self):print("普通用戶(hù)登錄") # class Memer(Base): # def login(self): # print("吧務(wù)登陸") class Memer(Base):pass class Admin(Base):def login(self):print("管理員登錄") n=Normal() m=Memer() a=Admin() n.login() m.login()#NotImplementedError: 你沒(méi)有重寫(xiě)該方法,滾回去重寫(xiě) a.login()?
二、異常處理
1、格式:
try:'''進(jìn)行操作''' except Exception as e:#Exception是異常的父類(lèi),可以捕獲所有的異常'''捕獲異常后,給予提示語(yǔ)''' else:'''try中沒(méi)有出現(xiàn)錯(cuò)誤,執(zhí)行這里的操作''' finally:'''不管出不出錯(cuò)都會(huì)執(zhí)行這里的操作'''解讀:程序先執(zhí)行try中的操作,如果出錯(cuò)了,就會(huì)走到except里面,進(jìn)行相應(yīng)的操作,如果沒(méi)有出錯(cuò),就直接執(zhí)行else里面的操作,不管出不出錯(cuò)都會(huì)執(zhí)行最后的finally.
2、拋出異常
(1)關(guān)鍵字 raise
def cul(a,b):if (type(a)==int or type(a)==float)and (type(b)==int or type(b)==float):return a+belse:raise Exception("請(qǐng)給我int或者float")#拋出異常,異常Exception ret=cul(3,"麻辣燙")#Exception: 請(qǐng)給我int或者float(2)自定義異常??
實(shí)現(xiàn):定義一個(gè)異常繼承Exception就可以實(shí)現(xiàn)自定義異常了(Exception是異常的基類(lèi),)
class GenderException(Exception):#定義了一個(gè)性別異常passclass Person:def __init__(self,name,gender):self.name=nameself.gender=genderdef got_nan_yushi(self):'''x洗澡:return:'''if self.gender=="男":print("歡迎光臨")else:raise GenderException("性別錯(cuò)了") #拋出自定義異常3、異常處理
(1)處理除數(shù)不能是0的異常
# ZeroDivisionError try: #把需要處理的對(duì)象放入其中print(10/0) except ZeroDivisionError as e:print("0不能做除數(shù)") # 異常處理結(jié)果顯示:0不能做除數(shù)(2)獲取錯(cuò)誤信息 :traceback (目的主要是方便程序員排查錯(cuò)誤)
import traceback #插入堆棧模塊 # traceback這個(gè)模塊可以獲取到我們每個(gè)?法的調(diào)用信息 try: #把需要處理的對(duì)象放入其中print(10/0) except ZeroDivisionError as e:val=traceback.format_exc()#獲取堆棧信息print("0不能做除數(shù)")print()print(val) # 異常處理結(jié)果顯示:0不能做除數(shù) 結(jié)果: 0不能做除數(shù)Traceback (most recent call last):File "E:/qishi/Day19 約束/04異常處理.py", line 79, in <module>print(10/0) ZeroDivisionError: division by zero?
?三、日記處理
1、基本步驟
1. 導(dǎo)入logging模塊.
2. 簡(jiǎn)單配置?下logging
3. 出現(xiàn)異常的時(shí)候(except). 向?志?寫(xiě)錯(cuò)誤信息
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) # 當(dāng)前配置表示 10以上的分?jǐn)?shù)會(huì)被寫(xiě)??件 # # 日記 # 1、導(dǎo)入logging模塊 # 2、簡(jiǎn)單配置;一下logging # 3、出現(xiàn)異常的時(shí)候,向日記里面寫(xiě)錯(cuò)誤信息 import logging import traceback # filename: ?件名 # format: 數(shù)據(jù)的格式化輸出. 最終在?志?件中的樣? # 時(shí)間-名稱(chēng)-級(jí)別-模塊: 錯(cuò)誤信息 # datefmt: 時(shí)間的格式 # level: 錯(cuò)誤的級(jí)別權(quán)重, 當(dāng)錯(cuò)誤的級(jí)別權(quán)重?于等于leval的時(shí)候才會(huì)寫(xiě)??件 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) # 當(dāng)前配置表示 10以上的分?jǐn)?shù)會(huì)被寫(xiě)??件 # 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("我是調(diào)試") # 10 # logging.log(2, "我是?定義") # ?定義. 看著給分try:ret=10/0 except ZeroDivisionError as e:print("正在寫(xiě)入日記")logging.error(traceback.format_exc())print("寫(xiě)入完畢")3、實(shí)例:產(chǎn)生10個(gè)錯(cuò)誤,記錄下來(lái)
?
import logging import tracebacklogging.basicConfig(filename='x1.txt', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=20) # 當(dāng)前配置表示 20以上的分?jǐn)?shù)會(huì)被寫(xiě)??件 class JackError(Exception):#自定義異常passfor i in range(10):try:if i%3==0:raise FileExistsError("文件不在押")elif i%3==1:raise KeyError("按錯(cuò)了")else:raise JackError("Jack錯(cuò)了")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("其他錯(cuò)誤")
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("按錯(cuò)了") KeyError: '按錯(cuò)了'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錯(cuò)了") JackError: Jack錯(cuò)了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("按錯(cuò)了") KeyError: '按錯(cuò)了'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錯(cuò)了") JackError: Jack錯(cuò)了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("按錯(cuò)了") KeyError: '按錯(cuò)了'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錯(cuò)了") JackError: Jack錯(cuò)了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: 文件不在押
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/angle6-liu/p/9947251.html
總結(jié)
以上是生活随笔為你收集整理的python 约束与异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 爬虫爬取百度词条
- 下一篇: python:更改pip源