約束和異常處理理
阿新 • • 發佈:2018-11-12
我們要約束程式的結構. 也就是說. 在分配任務之前就應該把功能定義好. 然後分別交給底下的程式設計師來完成相應的功能.
在python中有兩種辦法來解決這樣的問題.
1. 提取父類. 然後在父類中定義好方法. 在這個方法中什麼都不用幹. 就拋⼀個異 常就可以了了. 這樣所有的子類都必須重寫這個方法. 否則. 訪問的時候就會報
錯.
2. 使⽤用元類來描述父類. 在元類中給出⼀一個抽象方法. 這樣子類就不得不給出抽象方法的具體實現. 也可以起到約束的效果.
class Base:
def login(self):
raise NotImplementedError
class Normal(Base):
def login(self):
print("普通賬號的登陸")
class Merber (Base):
def login(self):
print("吧務的登陸")
class Admin(Base):
def jj(self):#丟擲這個異常
print("管理員的登陸")
def zhuce(obj):
obj.login()
n = Normal()
zhuce(n)
m = Merber()
zhuce(m)
a = Admin()
zhuce(a)
第二種用抽象方法
from abc import ABCMeta,abstractmethod
class Base(metaclass=ABCMeta):
@abstractmethod
def login(self):
pass
def hehe(self):
print("我會呵呵")
b = Base() #報錯的,原因是Base是一個抽象類,含有抽象方法,不允許建立物件
當我們需要對子類進行約束:
1.丟擲異常 NotImplementedError() 沒有實現 -> 約定俗成. 多觀察
2.寫抽象類
from abc import ABCMeta, abstractmethod
class Base(metaclass = ABCMeta):
@abstractmethod
def 方法(self):
pass
如果一個類中包含了抽象方法. 那麼這個類一定是一個抽象類
一個抽象類中可以包含正常的方法
介面: 介面中所有的方法都是抽象方法
子類必須重寫父類中的抽象方法. 否則子類也是一個抽象類
二、異常處理
程式設計師是發現不了自己的錯誤的(邊緣性錯誤)
try:
xxxx
except 錯誤名稱 as 別名:
出現錯誤的時候. 要幹什麼...
except 錯誤名稱 as 別名:
出現錯誤的是偶. 要幹什麼
....
except Exception as e: # 所有錯誤的根
出現的所有的錯誤. 我都可以這樣處理
else: # 很少用到
不出錯的時候執行這裡的程式碼
finally:
結束. 收尾工作
try:
print(1/0) # 0不能做除數 ZeroDivisionError: division by zero
except ZeroDivisionError as z:
print("錯了. 除數不能為0")
由python直譯器來呼叫程式碼. 出現了錯誤. 系統會自動的產生一個叫異常的物件.
系統會嘗試著把錯誤返回給呼叫方. 過程被稱為:拋異常
我們通過try...except 可以吧系統產生的這個錯誤獲取到. 過程叫捕獲異常
import traceback
#計算a+b
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("我要的不是這個")
try:
print(cul(1,"aff"))
except Exception as e:
print(traceback.format_exc())#獲取堆疊資訊
print("出現了錯誤")
自定義異常
class GenderException(Exception):
pass
class Person:
def __init__(self,name,gender):
self.name = name
self.gender = gender
def xizao(self):
if self.gender != "男":
raise GenderException("性別不對")
else:
print("歡迎光臨")
try:
p1 = Person("wusir","女")
p1.xizao()
except GenderException as e:
print("你去男澡堂幹嘛")
except Exception as e:
print("其他錯誤")
MD5密文處理
import hashlib
obj = hashlib.mad5(b"safx")
obj.update("alex".encode("utf-8"))
miwen = obj.hexdigest()
print(miwen)
五. 日誌
⾸首先, 你要知道在編寫任何⼀一款軟體的時候, 都會出現各種各樣的問題或者bug. 這些問 題或者bug⼀一般都會在測試的時候給處理理掉.
但是多多少少的都會出現⼀一些意想不到的異常 或者錯誤. 那這個時候, 我們是不知道哪⾥裡里出了了問題的. 因為很多BUG都不是必現的bug.
如果 是必現的. 測試的時候肯定能測出來. 最頭疼的就是這種不必現的bug. 我這跑沒問題. 客戶那 ⼀一⽤用就出問題.
那怎麼辦呢?我們需要給軟體準備⼀一套⽇日誌系統. 當出現任何錯誤的時候.
我 們都可以去⽇日誌系統⾥裡里去查. 看哪⾥裡里出了了問題. 這樣在解決問題和bug的時候就多了了⼀一個幫⼿手.
那如何在python中建立這個⽇日誌系統呢? 很簡單.
1. 匯入logging模組.
2. 簡單配置⼀一下logging
3. 出現異常的時候(except). 向日志⾥裡里寫錯誤資訊.
# import logging
# # filename: ⽂件名
# # format: 資料的格式化輸出. 最終在⽇志⽂件中的樣⼦
# # 時間-名稱-級別-模組: 錯誤資訊
# # datefmt: 時間的格式
# # level: 錯誤的級別權重, 當錯誤的級別權重⼤於等於leval的時候才會寫⼊⽂件
# logging.basicConfig(filename='x1.log',
# format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S',
# level=30)
# # 當前配置表示 0以上的分數會被寫⼊⽂件
# # 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("我是warning")
# logging.info("我是info")
# logging.debug("我是debug")
# logging.log(1, "我什麼都不是")
#
# import traceback
# try:
# print(1/0)
# except Exception:
# logging.error(traceback.format_exc()) # 用法
# print("出錯了")
import logging
# 建立⼀個操作⽇志的物件logger(依賴FileHandler)
# open()
file_handler = logging.FileHandler('zuo.log', 'a', encoding='utf-8')
file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
logger1 = logging.Logger('qq', level=20)
logger1.addHandler(file_handler) # 把檔案助手和日誌物件繫結
logger1.error('我是A系統出錯了') # 記錄日誌
# 再建立⼀個操作⽇志的物件logger(依賴FileHandler)
file_handler2 = logging.FileHandler('you.log', 'a', encoding='utf-8')
file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
logger2 = logging.Logger('B系統', level=20)
logger2.addHandler(file_handler2)