• 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方法了. 从而对子类进行了相应的约束.
     
        2、抽象类 -- 写抽象类和抽象⽅法
     
            抽象:动物的吃,一个动物到底怎么吃,描述不清。只有一个动作的概念,没有具体实现。
            一个类中含有抽象方法,那么这个类一定是抽象类,抽象类是不能有实例的(创建对象),比如抽象画,在现实世界找不到。、
     
    抽象类实现
     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. 这样比较专业, 而且错误比较明确.(推荐)
     
    二、异常处理
     
        1、基本异常
    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("其他错误")

    完整的

    1 try:
    2       '''操作'''
    3 except Exception as e:    
    4     '''异常的父类,可以捕获所有的异常'''
    5 else:    
    6     '''保护不不抛出异常的代码, 当try中无异常的时候执行行'''
    7 finally:                             #  finally一般用来作为收尾工作
    8     '''最后总是要执行行我'''

        2、抛出异常 -- raise关键字

     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. 程序会被中断. 并实例化后的异常对象. 抛给调用方. 如果调用方不处理. 则会把错误继续向上抛出. 最终抛给户. 如果调用方处理了异常. 那程序可以正常的执行.
     
        3、自定义异常
     
        只要继承了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, "我是⾃定义") # ⾃定义. 看着给分
  • 相关阅读:
    简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)
    使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例
    关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
    javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)
    最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类
    基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
    java原生实现屏幕设备遍历和屏幕采集(捕获)等功能
    用java实现简单快速的webservice客户端/数据采集器(支持soap1.1和soap1.2标准,支持utf-8编码)
    javacpp-opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(增加实时帧率计算方法)
    mybatis批量增、删、改(更新)操作oracle和mysql批量写法小记
  • 原文地址:https://www.cnblogs.com/hq82/p/9758295.html
Copyright © 2020-2023  润新知