面向對象---異常處理,約束,MD5加密,日誌處理,

思惟導圖:

1.異常處理

  首先說什麼是異常處理,異常處理就是在程序運行過程當中產生的錯誤,不正常,其實咱們在以前的時候已經見過了不少了,只要一報錯,就是異常處理python

  咱們先拿其中一個舉例子算法

def chufa(a,b) :
    try :
        ret = a / b
        return ret
    except ZeroDivisionError as e :
        print("出錯了,0不能夠是除數") #內部產生的全部異常都會被捕獲,捕獲的異常對象將交給e
chufa(10,0)  #division by zero

  咱們來說一個故事,假設主人公褚熙他是個人小弟,有一天我叫他去給我打劫去,這時候用到try的時候就到了,後面就接着except打劫.意思就是你大膽的去作,無論你怎麼着,我給你兜着打劫這個事情,可是換句話說,若是他小偷小摸的去便利店偷火腿,由於我說了,打劫的事情幫你兜着,可是我沒有說偷東西這個事情我給你兜着,因此若是褚熙去偷火腿,這個事情就不行了,就會報錯了.安全

  因此說try..except是什麼呢?嘗試運行xxx代碼,出現了錯誤,就執行except後面的代碼,在這個過程當中,當代碼出現錯誤時候.系統會產生一個異常對象,而後這個異常會向外拋,被exppt攔截,並把接受到的異常對象賦值給e.那這裏的e就是異常對象,那這裏的Exception的子類對象.咱們看到的ZeroDivisionError 其實就是Exceptiond 的子類,那這樣寫的好像有點問題,Exceptiond 表示全部的錯誤,太籠統了,全部的錯誤都會被認爲是Exception,當寫程序中出現多種錯誤的時候,就很差分類了,最好是出什麼異常就用什麼來處理,這樣就更加合理了.因此在try....execpt語句中,還能夠寫更多的except  app

def func():    
    try :    
    except ZeroDivisionError as e :
        print("出錯了,0不能夠是除數") #內部產生的全部異常都會被捕獲,捕獲的異常對象將交給e
    except FileExistsError as e :
        print("文件不存在")
    except Exception as  e :
        print("其餘錯誤")
         

  解讀:程序先執行操做,而後若是出錯了會走except中的代碼,若是不出錯,執行else中的代碼,不論出不出錯,最後都是要執行finally中的語句,通常咱們用try ... except就夠用了,頂多加上finally.finally通常用來作收尾的工做.測試

  上面的是異常處理,咱們在執行代碼的時候,若是出現了一些條件上不對等,根本不符合個人代碼邏輯的,好比參數,我要求你傳遞一個數字,你給我一個字符串,那對不起,這樣不對咱們沒有辦法幫你處理,若是是這樣的話,那我如何通知呢?ui

    方案一:直接返回便可,我無論你了加密

    方案二:拋出一個異常,告訴你,我很差惹,給我乖乖的回去  spa

方案一,以前遇到這樣的狀況咱們都會視而不見,直接繞過去,可是這樣的寫法並無寫起到警示做用,因此之後的代碼中若是出現相似的問題,直接拋出一個錯出去,那怎麼拋?  咱們要用到reise關鍵字debug

 

def add(a,b):
    '''
    計算兩個整數的加法
    :param a: 
    :param b: 
    :return: 返回a+b的值
    '''
    if type(a) != int or type(b) != int :
        raise  TypeError("我這裏只要int類型,不要別的類型")
    return a+b

若是調用方不處理異常,那產生的錯誤會繼續想外拋,最後就拋給了用戶調試

若是調用方處理異常,那麼錯誤就不會給用戶,程序也能夠正常進行

try:
    add("胡辣湯","褚熙")
except Exception as e :
    print("報錯了,本身處理吧")

 

說這麼多,異常也知道如何拋出和處理了,可是若是咱們如今用python給的異常,若是你有一天你寫的愛嗎出現了一個沒法用如今用的異常來解決問題,你該怎麼辦?

  自定義異常:很是簡單,只要你的類繼承Exception 類,那麼你的類就是一個異常類,就這麼簡單,好比你要寫個貓咪的程序,這個時候來個狗,怎麼辦?是否是要拋出種類異常

import  traceback  #獲取堆棧信息

class Cat(Exception):#Exception能夠包括全部的錯誤
    pass

class Animal :
    def __init__(self,name,pin_zhong):
        self.name = name
        self.pin_zhong =pin_zhong

def boSiCat(ani):
    if ani.pin_zhong != "cat" :
        raise Cat("不是貓的品種")
    else:
        pass

p1 = Animal("小羅","dog")
p2 = Animal("小哈","cat")
try:
    boSiCat(p1)  #__main__.Cat: 不是貓的品種
except Cat as e:
    print(e)
    val = traceback.format_exc()#報錯就會拋出一個異常
    print(val)

 這樣的話咱們就能夠收放自如,當測試代碼的時候吧堆棧的信息打印出來,但當到了線上的生產環境的時候就把這個堆棧去掉便可.

 

四.MD5加密 

md5是不可逆的加密算法,因此他是可靠的,而且安全,在Python中咱們不須要手寫這套算法,只須要引入一個hashlib的模塊就能夠搞定了加密工做

def my_mad(val):
    '''
    獲取密文
    :param val: 從用戶獲取的密碼進行加密
    :return: 返回加密後的密碼
    '''
    obj = hashlib.md5(b"zhaoruixin")  #建立一個md5對象
    obj.update(val.encode("utf-8"))#把加密內容給md5  必須是字節,因此須要解碼
    val = obj.hexdigest()#調用模塊
    return val

因此. 之後存密碼就不要存明文了. 要存密碼. 安全, 而且. 這裏加的鹽不能改來改去的.
不然, 整套密碼就都亂了

 

def my_md5(val):
    '''
    獲取密文
    :param val: 從用戶獲取的密碼進行加密
    :return: 返回加密後的密碼
    '''
    obj = hashlib.md5(b"zhaoruixin")  #建立一個md5對象
    obj.update(val.encode("utf-8"))#把加密內容給md5  必須是字節,因此須要解碼
    val = obj.hexdigest()#調用模塊
    return val

username = input("請輸入你的用戶名")#趙瑞鑫
pwd = input("請輸入密碼")#521
cun = my_md5(pwd)
print(cun)#a1a67811e0840823c6c7203669113ccd

#測試
if username =="趙瑞鑫" and my_md5(pwd) == "a1a67811e0840823c6c7203669113ccd":
    print("登陸成功")
else:
    print("用戶名或密碼錯誤")

 

 五,日誌

  首先你要知道在編寫的時候都會出現一些問題或者bug,這些問題或者bug都會在測試的時候處理掉,可是多多少少會有些意向不到的意外情況,那這個時候,咱們是不知道哪裏出現了問題,由於不少bug都不是必現的,測試的時候必定能測出來,最頭痛的是這樣的沒必要現bug.在這裏跑沒問題.到了用戶那裏,就會出問題,怎麼辦?因此給軟件準備一套日誌系統,當出現錯誤的時候,咱們能夠去日誌系統去查看,看是哪裏出現了問題,那麼如何建立這個日誌系統吶 ?

  1.導入logging模塊

  2.簡單配置一些logging

  3.出現異常的是(except),向日志裏寫錯誤

import logging
logging.basicConfig(filename='app.log',
                    format = '%(asctime)s - % (name)s - %(levelname)s - %(module)s : %(message)s',
                    datefmt = "%Y- %m -%d  %H:%M:%S ",
                    level = 40)  #level 設置級別,當你的信息級別 >= level的時候纔會寫入日誌文件,默認是30

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
# 寫日誌
logging.critical("我是critical")#最嚴重的錯誤
logging.error("我是error")#第二嚴重的錯誤
logging.warning("我是警告")
logging.info("我是基本信息")
logging.debug("我是調試")
logging.log(2, "我是自定義")

 

多個日誌文件操做

# 多文件日誌處理
# 建立⼀個操做⽇志的對象logger(依賴FileHandler)
file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8')
# 設置日誌文件內容的格式
file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
logger1 = logging.Logger('A', level=40)
logger1.addHandler(file_handler)
# 記錄日誌
logger1.error('我是A系統')
相關文章
相關標籤/搜索