zoukankan      html  css  js  c++  java
  • 异常处理,约束,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系统')
    

      

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/xihuanniya/p/9750983.html
Copyright © 2011-2022 走看看