20_異常處理相關

1、類的約束
    
    要約束程序的結構,再分配任務時要把功能定義好,而後交給 程序員分別完成相應的功能。
 
    一、提取父類 -- 而後在父類中定義好方法. 在這個方法中什麼都不用幹. 就拋一個異常就能夠了. 這樣全部的子類都必須重寫這個方法. 不然訪問的時候就會報錯
         第一種解決方案: 首先, 提取一個父類. 在父類中給出一個方法. 而且在方法中不給出任何代碼. 直接拋異常.
 1 class Base:    
 2     def login(self):        
 3         raise Exception("你沒有實現login方法()")      Exception是全部異常的根.(很差,沒法判斷出的什麼錯),專業的NotImplementError(沒有實現的錯誤)
 4 class Normal(Base):
 5     def login(self):
 6             pass
 7 class Member(Base):
 8     def denglu(self):
 9             pass
10 class Admin(Base):
11     def login(self):
12             pass
13 
14 # 項目經理理寫的總入口
15 def login(obj):
16     print("準備驗證碼.......")
17     obj.login()
18     print("進入主頁.......")
19 n = Normal()
20 m = Member()
21 a = Admin()
22 login(n)
23 login(m)    # 報錯.
24 login(a)
 
    在執行到login(m)的時候程序會報錯. 緣由是, 此時訪問的login()是父類中的方法. 可是父類中的方法會拋出一個異常. 因此報錯. 這樣程序員就不得不寫login方法了. 從而對子類進行了相應的約束.
 
    二、抽象類 -- 寫抽象類和抽象⽅法
 
        抽象:動物的吃,一個動物到底怎麼吃,描述不清。只有一個動做的概念,沒有具體實現。
        一個類中含有抽象方法,那麼這個類必定是抽象類,抽象類是不能有實例的(建立對象),好比抽象畫,在現實世界找不到。、
 
抽象類實現
 1 from abc import ABCMeta, abstractmethod
 2 #注意,Python中抽象類中能夠含有普通方法
 3 
 4 class IGame(metaclass = ABCMeta):
 5     @abstractmethod
 6     def play(self):
 7         pass
 8 
 9     def turn_off(self):
10         print("ko")
11 
12 class DNFGame(IGame):  # 子類必須實現父類中的抽象方法,不然子類也是抽象類
13     def play(self):
14         print("dnf的玩法")
15 
16 dg = DNFGame()
17 dg,play()
 
總結:  
 
約束,其實就是父類對子類進行約束. 子類必需要寫xxx方法. 在python中約束的方式和方法有兩種: 1. 使用抽象類和抽象方法, 因爲該方案來源是java和c#. 因此使用頻率仍是不多的   2. 使用人爲拋出異常的方案.  而且儘可能拋出的是NotImplementError. 這樣比較專業, 並且錯誤比較明確.(推薦)
 
2、異常處理
 
    一、基本異常
1 def chu(a, b):    
2     return a/b
3 try:    ret = chu(10, 0)    
4     print(ret)
5 except Exception as e:    
6     print("除數不不能是0")
7 
8 結果: 除數不不能是0
 
嘗試着運行xxxxx代碼. 出現了錯誤. 就執行except後面的代碼. 在這個過程當中. 當代碼出現錯誤的時候. 系統會產生一個異常對象. 而後這個異常會向外拋. 被except攔截. 並把接收到的異常對象賦值給e. 那這裏的e就是異常對象. Exception是全部異常的基類。
1 try:    print("各類操做....")
2 except ZeroDivisionError as e:
3     print("除數不不能是0")
4 except FileNotFoundError as e:
5     print("文件不不存在")
6 except Exception as e:    
7     print("其餘錯誤")

完整的java

1 try:
2       '''操做'''
3 except Exception as e:    
4     '''異常的父類,能夠捕獲全部的異常'''
5 else:    
6     '''保護不不拋出異常的代碼, 當try中無異常的時候執行行'''
7 finally:                             #  finally通常用來做爲收尾工做
8     '''最後老是要執行行我'''

    二、拋出異常 -- raise關鍵字python

 1 def add(a, b):
 2     '''
 3     給我傳遞兩個整數. 我幫你計算兩個數的和
 4     :param :param a:
 5     :param :param b:
 6     :return :return:
 7     '''
 8     if not type(a) == int and not type(b) == int:        # 當程序運到這句話的時候. 整個函數的調會被中斷. 並向外拋出個異常.
 9         raise Exception("不是整數, 朕不能幫你搞定這麼複雜的運算.")
10     return a + b    # 若是調不處理異常. 那產的錯誤將會繼續向外拋. 最後就拋給了戶
11     
12 # add("你好", "我叫賽利亞")
13 # 若是調處理了異常. 那麼錯誤就不會丟給戶. 程序也能正常進
14 try:
15     add("胡辣湯", "滋滋冒油的腰")
16 except Exception as e:
17     print("報錯了. 處理去吧")
當程序運到raise. 程序會被中斷. 並實例化後的異常對象. 拋給調用方. 若是調用方不處理. 則會把錯誤繼續向上拋出. 最終拋給戶. 若是調用方處理了異常. 那程序能夠正常的執行.
 
    三、自定義異常
 
    只要繼承了Exception類,那這個類就是異常類
 1 import traceback
 2 class GenderError(Exception):
 3     pass
 4 
 5 class Person:
 6     def __init__(self, name, gender):
 7         self.name = name
 8         self.gender = gender
 9 
10 def nan_gu_ke_xi_zao(per):
11     if per.gender != "":
12         raise GenderError("這裏是XX的男澡堂子. ")
13     else:
14         pass
15 p1 = Person("alex", "不詳")
16 # nan_gu_ke_xi_zao(p1)
17 p2 = Person("wusir", "不詳")
18 try:
19     nan_gu_ke_xi_zao(p2)
20 except GenderError as g:
21     print(g)
22     val = traceback.format_exc() # 獲取錯誤堆棧
23     print(val)

 

 

MD5是一種不可逆的加密算法程序員

 1 1、普通
 2 import hashlib
 3 obj = hashlib.md5()
 4 obj.update("alex".encode("utf-8")) # 加密的必須是字節
 5 miwen = obj.hexdigest()
 6 print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f
 7 
 8 2、高級
 9 import hashlib
10 obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf") # 加鹽
11 obj.update("alex".encode("utf-8")) # 加密的必須是字節
12 miwen = obj.hexdigest()
13 print(miwen) # 99fca4b872fa901aac30c3e952ca786d
14 
15 3、MD5應用
16 import hashlib
17 def my_md5(s):
18     obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf")
19     obj.update(s.encode("utf-8")) # 加密的必須是字節
20     miwen = obj.hexdigest()
21     return miwen
22 # alex: 99fca4b872fa901aac30c3e952ca786d
23 username = input("請輸⼊⽤戶名:")
24 password = input("請輸⼊密碼:")
25 # 數據存儲的時候.
26 # username: my_md5(password)
27 # 假設如今的⽤戶名和密碼分別是
28 # wusir: 99fca4b872fa901aac30c3e952ca786d ==> wusir: alex
29 # ⽤戶登陸
30 if username == "wusir" and my_md5(password) == "99fca4b872fa901aac30c3e952ca786d":
31     print("成功")
32 else:
33     print("失敗")

 

日誌處理算法

 1 # filename: ⽂件名
 2 # format: 數據的格式化輸出. 最終在⽇志⽂件中的樣⼦
 3 # 時間-名稱-級別-模塊: 錯誤信息
 4 # datefmt: 時間的格式
 5 # level: 錯誤的級別權重, 當錯誤的級別權重⼤於等於leval的時候纔會寫⼊⽂件
 6 logging.basicConfig(filename='x1.txt', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=0) # 當前配置表示 10以上的分數會被寫⼊⽂件
 7 # CRITICAL = 50
 8 # FATAL = CRITICAL
 9 # ERROR = 40
10 # WARNING = 30
11 # WARN = WARNING
12 # INFO = 20
13 # DEBUG = 10
14 # NOTSET = 0
15 logging.critical("我是critical") # 50分. 最貴的
16 logging.error("我是error") # 40分
17 logging.warning("我是警告") # 警告 30
18 logging.info("我是基本信息") # 20
19 logging.debug("我是調試") # 10
20 logging.log(2, "我是⾃定義") # ⾃定義. 看着給分
相關文章
相關標籤/搜索