zoukankan      html  css  js  c++  java
  • day27 异常处理 和 网络协议

    元类补充

    class MyMeta(type):
        # 用于新建类对象
        def __new__(cls,*args,**kwargs)
            print(MyMeta)
            print(*args)
        # 调用type通过的__new__方法来创建一个空的类对象,已经将类的三个组成部分都放到类对象中了
        res=type.__new__(cls,*args,**kwargs)
        
        def __init__(self,class_name,bases,namespace):
            print('init run')
            print(self)
            
    class Student(metaclass = MyMeta):
        def f1():
            print('nice')

    new 与 init的区别

    __new__ 比__init__先执行 其作用是创建一个空的类对象
    作为一个类对象 必须具备是三个组成部分  所以调用type中的__new__来完成组装 
    得到这个类对象后需要将其返回 以供__init__来使用

    1.异常护理 *****

    什么是异常
    指的是 与正常情况不同
    在程序中 程序的正常执行过程 按照代码顺序 一行一行很执行  直到所有代码都执行完
    如果在执行过程中 出现了错误 导致代码无法执行完毕 就称之为异常
    
    即 异常其实就是代码执行过程中出错了
    常见的异常
    当异常发生时 解释器 会打印异常详细信息  并且终止程序的执行
    
    如何排查排查错误
    1.定位到错误发生的位置
        查看追踪信息
        1.如果你的代码都是自己写的 没有调用任何内置模块或方法  那么错误发生位置一定在最后一行
        2.如果你的代码调用其他模块的方法
            1.是系统内置的模块  例如抛出位置object.py 不用去查看object类  它几乎不可能出错
            一定是你自己代码在调用时出了错误
    
            2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
        绝招:如果有很多追踪信息  找最后一行是你自己写代码的位置
    2.查看异常类型  例如:IndexError
    3.查看异常的值  例如: list index out of range
    
    如果没有任何异常信息 但是程序就是不对 可以使用
    排除法,把程序一步一步注释起来执行
    
    异常的三个组成部分
    追踪信息
    异常类型
    异常的值
    
    异常一旦发生就会导致程序终止 这对于用户而言体验极差 所以我们需要有一种机制
    能够防止程序因为异常而终止
    
    a =
    # SyntaxError: invalid syntax   语法错误
    
    age
    # NameError: name 'age' is not defined   名字不存在
    
    open("asasasas")
    # FileNotFoundError: [Errno 2] No such file or directory: 'asasasas'  路径错误
    
    f = open("1.今日内容")
    f.close()
    f.read()
    #ValueError: I/O operation on closed file.   文件已经关闭  你还要去读写
    
    f = open("1.今日内容",mode="rt",encoding="utf-8")
    f.write("123")
    # io.UnsupportedOperation: not writable 不能写入数据  读写模式错误导致
    
    int("abc")
    # ValueError: invalid literal for int() with base 10: 'abc' 数据的值错误导致
    
    def func():
    print(1)
     print(2)
    # IndentationError: unexpected indent   缩进错误
    
    li = []
    li[1]
    # IndexError: list index out of range   索引不存在
    
    dic = {}
    dic["name"]
    # KeyError: 'name'   key不存在
    
    异常可以由 发生的时间不同分为两类
    1.语法检测异常
        解释器在执行代码前会先检测语法 检测通过才会开始执行
        如果这个阶段发生了异常 代码一行都不会执行
        语法错误 和  缩进错误
        这种低级错误 就别问了
    2.运行时异常
        已经通过了语法检测 在解析执行期间发生的异常
        
    
    # print("start")
    
    # a = int("abc")
    
    # print("over")
    
    li = []
    # # 语法1
    # try:
    #      # 把可能发出错误的代码放到try中
    #     print("start")
    #     a = int("abc")
    #     li[1]
    #     print("over")
    #
    # except ValueError:
    #     # 当try中真的发生了错误 就会执行 except中的代码
    #     # 在这里可以做一些补救措施
    #     print("发生了 ValueError异常")
    #
    # print("over")
    
    # # 语法2 except可以有多个
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        a = int("abc")
        li[1]
        print("over")
    
    except ValueError:
        # 当try中真的发生了错误 就会执行 except中的代码
        # 在这里可以做一些补救措施
        print("发生了 ValueError异常")
    except IndexError:
        print("发生了 IndexError  索引不正确")
    print("over")
    
    # 语法4 万能异常 Exception类  尽量少用 可能会导致 程序既不报错 也不正常运行 无法定位错误位置
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        # a = int("abc")
        # li[1]
        10 / 0
        dic = {}
        dic["name"]
        print("over")
    
    except Exception:
        print("可能是任何类型的错误 反正是发生错误了")
    print("over")
    
    # 语法5 万能异常 Exception类  建议 输出异常的值
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        # a = int("abc")
        li[1]
        # 10 / 0
        dic = {}
        dic["name"]
        print("over")
    
    # 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
    except Exception as e:
        print("可能是任何类型的错误 反正是发生错误了")
        print(e)
        print(type(e))
    print("over")
    
    
    # # 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        # a = int("abc")
        # li[1]
        10 / 0
        dic = {}
        dic["name"]
        print("over")
    except ValueError:
        print("值不对.....")
    except ZeroDivisionError:
        print("除数不能为0")
    # 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
    except Exception as e:
        print("可能是任何类型的错误 反正是发生错误了")
        print(e)
        print(type(e))
    
    print("over")
    
    # 语法7 try except else
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        # a = int("abc")
        li[1]
        # 10 / 0
        dic = {}
        # dic["name"]
        print("over")
    except ValueError:
        print("值不对.....")
    except ZeroDivisionError:
        print("除数不能为0")
    # 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
    except Exception as e:
        print("可能是任何类型的错误 反正是发生错误了")
        print(e)
        print(type(e))
    else: #当没有发生异常会执行else    只能except的后面
        print("执行了else")
    print("over")
    
    # 语法8 try except finally
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        a = int("abc")
        # li[1]
        # 10 / 0
        dic = {}
        # dic["name"]
        print("over")
    except ValueError:
        print("值不对.....")
    else:
        print('else')
    finally: #无论是否发生异常 最后都会执行finally中的代码
        print("finally")
    print("over")
    
    import io
    # finally的使用场景  可以用finally来执行一些清理操作  类似__del__
    try:
        print("start")
        f = open("1.今日内容","rt",encoding="utf-8")
        f.read()
        f.write('aaa')
        print("end")
    except FileNotFoundError:
        print("文件路径错误...")
    except io.UnsupportedOperation:
        print("文件不能被写入....")
    finally:
        f.close()
    
    
    print(f.closed)

    完整的书写顺序

    try
    except
    else
    finally
    
    你需要掌握的语法
    1.
    try:
    except:
    
    2.
    try:
    except:
    finally:

    正确使用异常处理

    1.如果明确指定异常发生原因,就不要产生异常,使用if判断等方式
    2.不知道异常发生的原因,但是知道异常的类型,那就明确捕获该类型的异常
    3.不知道发生原因,也不知道异常的类型,可以使用万能异常,但是一定要打印异常消息,方便了解异常信息

    做一个登录功能 如果登录失败就抛异常

    主动抛出异常
    # 当你写了一些功能 是提供给别人用的 然而使用者不按照你的方式来使用,就会导致程序出错
    # 而且我们无法帮助用户处理这个错误
    # 这时候就可以主动抛出异常
    # raise 关键字  后面跟 任意Exception类型的子类
    
    # 自定义异常类型
    class LoginException(Exception):
        pass
    
    def login():
        name = input("username:").strip()
        pwd = input("password:").strip()
    
        if name == "blex" and pwd == "123":
            print("登录成功!")
        else:
            raise LoginException("用户名或密码不正确....")
    
    login()

    断言

    其实就是断定的意思,我很确定某个条件一定成立
    
    有一段代码,要执行必须要保证某个条件是成立的
    
    # 有一堆姓名 需要被处理
    names = ["张三","李四","王麻子"]
    names = []
    # 一定要保证列表中有数据需要被处理
    if not names:
        raise TypeError("没有数据需要处理....")
    
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    
    
    names = [1]
    # 使用断言来简化代码    断言后面跟一个bool类型表达式  如果结果为True则继续往下执行
    # 否则直接抛出异常 AssertionError
    # 其局限性是  异常类型是固定的 而且不能指定异常信息
    # assert 1
    assert names
    
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")

    2.网络协议 ****

    以太网协议
    规定了一组电信号为帧,最大1518字节
    一个数据帧由head和data组成
    规定每个电脑必须有mac地址,它是全球唯一的
    有了地址以后能够通过广播的方式来传输数据
    广播太多会造成广播风暴,交换机会自动学习,可以降低广播的次数
  • 相关阅读:
    小记css的margin collapsing
    linux—select具体解释
    搜索引擎技术之概要预览
    多线程和多进程的差别(小结)
    Android Bundle类
    Android中Preference的使用以及监听事件分析
    layoutSubviews总结
    win7下jdk安装环境变量配置
    LSPCI具体解释分析
    将二叉树转换成双向链表
  • 原文地址:https://www.cnblogs.com/shanau2/p/10149767.html
Copyright © 2011-2022 走看看