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

約束和異常處理理

  我們要約束程式的結構. 也就是說. 在分配任務之前就應該把功能定義好. 然後分別交給底下的程式設計師來完成相應的功能.        

在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)