• 异常处理,约束,MD5加密日志处理


    程序运行过程中产生的错误, 不正常
    def chufa(a, b):
       try: # 尝试执行xxx代码
           ret = a/b # 如果这里出现了错误. 异常. 系统内部会产生一个异常对象. 系统会把这个错误抛出.
    抛给调用方 return ret except ZeroDivisionError as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") except FileNotFoundError as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") except StopIteration as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") except Exception as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数")   finally:
        最后执行这个,文件造作
    ..... ret = chufa(10, 0) print(ret)

      

    自定义异常:

    import traceback
    
    class GenderError(Exception):#抛出异常
        pass
    
    class Person:
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
    def nan_gu_ke_xi_zao(per):
        if per.gender != "男":
            raise GenderError("这里是刘伟的男澡堂子. ")
        else:
            pass
    p1 = Person("alex", "不详")
    # nan_gu_ke_xi_zao(p1)
    p2 = Person("wusir", "不详")
    try:#处理异常
        nan_gu_ke_xi_zao(p2)
    except GenderError as g:
        print(g)
        val = traceback.format_exc() # 获取错误堆栈
        print(val)
    

      

    约束:

    class Base:
        def login(self):
            raise NotImplementedError("没有实现login方法") # 专业的写法   闹特A噗安门特
        def kantie(self):
            raise NotImplementedError("没有实现看帖功能")
    # 张三
    class Normal(Base):
        def login(self):
            print("普通人登陆")
    
    # 李四
    class Member(Base):
        def denglu(self):
            print("吧务登陆")
    
    # 王五
    class Admin(Base):
        def login(self):
            print("管理员登陆")
    
    def login(obj):
        print("产生验证码")
        obj.login() # 标准在这里.  必须由login
        print("进入主页")
    
    # 场景
    n = Normal()
    m = Member()
    a = Admin()
    login(n)
    login(m)
    login(a)
    重写:子类对父类提供的方法不满意。 重新去定义这个方法

      

    
    
    from abc import ABCMeta, abstractmethod
    
    class Animal(metaclass=ABCMeta): # 在父类中写出metaclass= xxx  抽象类, 类中存在抽象方法,
    类一定是抽象类 @abstractmethod # 抽象方法 def chi(self): # 抽象的概念. pass def haha(self): print("娃哈哈") class Cat(Animal): # 子类必须实现父类中的抽象方法. def chi(self): # 具体的实现 print("猫爱吃鱼") Cat()

      

    from abc import ABCMeta,abstractmethod
    
    class Base(metaclass=ABCMeta):
        @abstractmethod
        def login(self):pass
    
    # 张三
    class Normal(Base):
        def login(self):
            print("普通人登陆")
    
    # 李四
    class Member(Base):
        def login(self):
            print("吧务登陆")
    
    # 王五
    class Admin(Base):
        def login(self):
            print("管理员登陆")
    
    def login(obj):
        print("产生验证码")
        obj.login() # 标准在这里.  必须由login
        print("进入主页")
    
    # 场景
    n = Normal()
    m = Member()
    a = Admin()
    login(n)
    login(m)
    login(a)
    

      

    MD5加密:   MD5加密不可逆

    update   啊破DA特
    hashlib
    import hashlib
    
    # 1. 创建一个MD5对象
    obj = hashlib.md5(b"flkjsdalkfjklasdjfklasjkflasdjklfasdjflkadsj") # 加盐
    
    # 2. 把要加密的内容给md5
    obj.update("alex".encode("utf-8")) # 必须是字节
    
    # 3. 获取密文
    val = obj.hexdigest()   # 534b44a19bf18d20b71ecc4eb77c572f aa7aa5ec13222b27f76a094207c5ac75
    print(val)
    

      函数

    def my_md5(val):
        obj = hashlib.md5(b"flkjsdalkfjklasdjfklasjkflasdjklfasdjflkadsj")
        obj.update(val.encode("utf-8"))
        val = obj.hexdigest()
        return val
    

      

    注册

    注册的时候. 用md5进行加密. 存储的是加密后的密文
    username = input("请输入用户名")
    password = input("请输入密码")
    # cun = my_md5(password)
    # print(cun) # alex 26adff81aa6778d26999b95ddc0e50b2
    if username == "alex" and my_md5(password) == "26adff81aa6778d26999b95ddc0e50b2":
        print("登录成功")
    else:
        print("登录失败")
    

      

    日志处理:

    进入这个模块:  

    import logging
    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, "我是自定义")
    

      

    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
    

      

    如何用他

    import traceback   堆栈

    for i in range(20):
        try:
            if i % 3 == 0:
                raise FileNotFoundError("我是FileNotFountException")
            elif i % 3 == 1:
                raise StopIteration()
            elif i % 3 == 2:
                raise KeyError()
    
        except FileNotFoundError as e:
            val = traceback.format_exc()
            logging.error(val)
        except StopIteration as e:
            val = traceback.format_exc()
            logging.error(val)
        except KeyError as e:
            val = traceback.format_exc()
            logging.error(val)
        except Exception as e:
            val = traceback.format_exc()
            logging.error(val)
    

      

    多文件

    # 多文件日志处理
    # 创建⼀个操作⽇志的对象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系统')
    
    
    
    # 再创建⼀个操作⽇志的对象logger(依赖FileHandler)
    file_handler2 = logging.FileHandler('l2.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=40)
    logger2.addHandler(file_handler2)
    # 记录日志
    logger2.error('我是B系统')
    

      

  • 相关阅读:
    C#实现一个万物皆可排序的队列
    面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
    递归基础练习1
    异步调用
    归并排序
    常见排序算法整理(冒泡、选择、插入、堆等)
    最大堆和最小堆java代码实现
    web内容如何保护:如何有效地保护 HTML5 格式的视频内容?
    TML转义字符:xss攻击与HTML字符的转义和反转义
    新一代构建工具(1):对比rollup/parcel/esbuild—esbuild脱颖而出
  • 原文地址:https://www.cnblogs.com/xihuanniya/p/9750983.html
Copyright © 2020-2023  润新知