• Python中的异常处理和套接字编程Socket


    Python学习之从入门到放弃,喜欢的可以关注一下哦。

    异常处理

    1 什么是异常?

    • 异常是错误发生的信号,一旦程序出错就会产生一个异常。
    • 如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止

    异常的组成部分:

    1.具体哪一行代码抛出的异常

    2.异常的种类

    NameError:变量名没有定义过
    IndexError:索引不存在
       l=[11,22]
       l[100]
    KeyError
       d={"k1":11}
       d["k2"]
    AttributeError:对象属性不存在
       对象.属性
    ValueError:
       int("asdf")
    TypeError:
       "asdf"+1111
    ZeroDivisionError
       1/0
    等等....
    

    3.异常的内容信息

    示例:代码报错内容

    Traceback (most recent call last):
      File "E:/code/s15-day28/01 异常处理.py", line 195, in <module>
        assert len(salaries) == 3
    AssertionError
    

    2 为什么要去处理异常

    为了增强程序的健壮性

    3 如何处理异常

    1. 针对语法错误的异常:

    应该在程序运行以前立即改正。(不可犯错误)

    2.针对逻辑错误的异常:

    2.1 如果逻辑错误发生的条件是可以预知的,

    应该if判断解决,预防异常

    age = input('>>: ').strip()
    if age.isdigit():
        age=int(age)
        if age > 18:
            print('too big')
        elif age < 18:
            print('too small')
        else:
            print("got it")
    else:
        print('必须输入数字')
    

    2.2 如果逻辑错误发生的条件是不可预知的,那么异常一定会发生,

    考虑到程序的健壮性
    我们应该处理异常,做好补救措施

    try:
        代码块
    except 异常的类型:
        发生异常后要执行的代码
    

    示例异常处理:

    1.接收的异常必须是程序所抛出的异常:

    try:
        print("====>111")
        print("====>222")
        xxx  #异常处
        print("====>333")
    except AttributeError as e:
        print(e)
    
    print('====>4')
    

    结果:

    ====>111
    ====>222
    Traceback (most recent call last):
      File "E:/code/s15-day28/01 异常处理.py", line 64, in <module>
        xxx
    NameError: name 'xxx' is not defined   
    #异常类型是NameError 不是AttributeError 所以异常没有被接收到。
    

    2.用正确的异常报错去接收抛出的异常:

    try:
        print("====>111")
        print("====>222")
        xxx
        print("====>333")
    except NameError as e:
        print(e)
    print('====>4')
    

    结果:

    ====>111
    ====>222
    name 'xxx' is not defined
    ====>4
    as e 表示的是接收所抛出的异常,并且赋值给e
    再打印出来用    print(e)
    

    3.多异常接收 1:

    try:
        print("====>111")
        print("====>222")
        # xxx
        # l=[]
        # l[0]
        dic={}
        dic["k1"]
        print("====>333")
    except (NameError,IndexError) as e:
        print("=---->",e)
    except KeyError as e:
        print(e)
    
    print('====>4')
    

    结果

    ====>111
    ====>222
    'k1'
    ====>4
    #如果把 xxx 解除注释。我们需要注意,不会执行下面其他的异常,只会执行NameError异常
    
    ====>111
    ====>222
    =----> name 'xxx' is not defined
    ====>4
    

    4.finally:

    try:
        print("====>111")
        print("====>222")
        xxx=111
        # l=[]
        # l[0]
        dic={}
        # dic["k1"]
        print("====>333")
    except (NameError,IndexError) as e:
        print("=---->",e)
    except KeyError as e:
        print(e)
    finally:
        print("一定会运行")
    print('====>4')
    print(xxx)
    

    结果:

    ====>111
    ====>222
    ====>333
    一定会运行   #不管程序报不报错,都会执行finally 
    ====>4   
    111
    #还有我们要注意在try 中的代码还是顶级代码,可以看print(xxx)这个代码
    

    注意:

    无论异常与否,都会执行该模块,通常是进行清理工作

    5.万能异常 Exception:

    try:
        print("====>111")
        print("====>222")
        # xxx
        l=[]
        # l[0]
        dic={}
        dic["k1"]
        print("====>333")
    except Exception as e:
        print("万能异常",e)
    print('====>4')
    

    结果

    ====>111
    ====>222
    万能异常 'k1'
    ====>4
    

    6.主动触发异常 raise:

    print('==>11')
    raise NameError("变量名未定义")
    print('==>222')
    

    结果

    Traceback (most recent call last):
      File "E:/code/s15-day28/01 异常处理.py", line 144, in <module>
        raise NameError("变量名未定义")
    NameError: 变量名未定义
    ==>11
    

    主动触发异常的应用场景:

    class Animal:
        def speak(self):
            raise BaseException("小垃圾必须实现speak方法来覆盖")
    
        def run(self):
            raise BaseException("小垃圾必须实现run方法来覆盖")
    
    class Dog(Animal):
        pass
    class Pig(Animal):
        pass
    
    d=Dog()
    p=Pig()
    
    d.speak()
    d.run()
    
    p.speak()
    d.run()
    

    在公司里多人一起写代码的时候,我们可以适用报异常的方法,希望适用鸭子类型去定义类,那么我们就必须要每个类中都有相对应的代码,用主动触发异常的方式可以提醒各位,需要取覆盖此功能。就不必我们去调用abc模块了

    7.自定义异常:

    class Interface(BaseException):
        def __init__(self, msg, x, y, z):
            self.msg = msg
            self.x = x
            self.y = y
            self.z = z
        def __str__(self):
            return "<%s:%s:%s:%s>" % (self.msg,self.x,self.y,self.z)
    
    raise Interface("接口异常", 11, 22, 33)
    

    结果

    Traceback (most recent call last):
      File "E:/code/s15-day28/01 异常处理.py", line 181, in <module>
        raise Interface("接口异常", 11, 22, 33)
    __main__.Interface: <接口异常:11:22:33>
    

    8.断言:assert 条件

    salaries=[1984,2752]
    
    # if len(salaries) != 3:
    #     raise NameError
    assert len(salaries) == 3
    print(salaries[0])
    print(salaries[1])
    print(salaries[2])
    

    结果

    Traceback (most recent call last):
      File "E:/code/s15-day28/01 异常处理.py", line 190, in <module>
        assert len(salaries) == 3
    AssertionError   #断言错误。
    

    其实断言效果就是相当于if判断。

    9.总结try…except

    • 1:把错误处理和真正的工作分开来
    • 2:代码更易组织,更清晰,复杂的工作任务更容易实现
    • 3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了

    套接字编程

    1.什么是socket?

    网络基础=》socket

    2、为何要学习socket编程:

    基于socket开发一个C/S或者B/S结构的软件

    Client---------网络------------Server
    Browser--------网络------------Server

    3、如何基于socket编程

    **网络:**https://www.cnblogs.com/linhaifeng/articles/5937962.html

    3.1网络是什么?

    底层的物理连接介质+互联网通信协议
    OSI七层协议

    3.2网络存在的意义是什么?

    通信

    4、OSI七层协议

    互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

    如图:
    在这里插入图片描述

    OSI七层协议数据传输的封包与解包过程

    如图:
    在这里插入图片描述

    努力学习!
  • 相关阅读:
    2019.10.25 csp-s模拟测试87 反思总结
    2020.7.13
    2020.7.12 5. 最长回文子串
    全序列匹配(java)
    2020.7.10 刷题
    Matlab可视化小结
    C-means
    银行家算法(java swing)界面
    完全数——多线程 (Java)
    SIR模型实现(matlab)
  • 原文地址:https://www.cnblogs.com/Orange-YXH/p/13648104.html
Copyright © 2020-2023  润新知