• 约束和异常处理


      我们要约束程序的结构. 也就是说. 在分配任务之前就应该把功能定义好. 然后分别交给底下的程序员来完成相应的功能.        

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













  • 相关阅读:
    小心使用宏
    常见文件、目录、路径操作函数
    链表法页框的分配和去配
    获取调试符号文件
    Visual C++ Runtime Error 调试
    HEAP: Free Heap block XXXX modified at XXXX after it was freed
    磁盘操作 API
    【转】浅谈大型网站动态应用系统架构 Mr
    jQuery1.3.1 Tab选项卡 Mr
    spring依赖注入思想 Mr
  • 原文地址:https://www.cnblogs.com/DanielYang11/p/9947356.html
Copyright © 2020-2023  润新知