python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3

异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来

影响:整个程序无法再正常运行

python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3

异常的结构 异常的类型

NameError

异常的信息

name 'safaf' is not defined

异常的位置 ''' Traceback (most recent call last): File "E:/PyCharm 2019.1.3/ProjectFile/day010/day029/01 异常处理.py", line 1, in <module> safaf ''' 异常的种类 语法错误

程序错误编译成一般都会直接有提示,提示就应该直接解决的,出现语法错误一般是基础太差。

逻辑错误

这种错误是可以被容忍的,逻辑错误无法一眼看出来

针对逻辑上的错误可以采用异常处理机制来进行捕获

常见的错误类型 常见的出错类型 原因
NameError   名字错误  
SyntaxError   语法错误  
keyError   键不存在  
ValueError   值错误  
IndexError   索引错误  
如何避免 异常处理

使用:在你认为可能会出现问题的代码上方用 try 包起来

注意:try 内部的代码块越少越好

异常处理能少用就少用,不然该报错的不报错哪里错了你都不知道

像服务端、客户端断开链接就需要用到异常处理,你不知道他什么时候会断开

异常处理使用模板(try.. except.. else.. finally..) try: 可能出错的代码 except 出错类型 as e: # 将报错信息赋值给e 错误的处理代码 except 出错类型2 as e: # 将报错信息赋值给e 错误的处理代码 except 出错类型3 as e: # 将报错信息赋值给e 错误的处理代码 # 或者 Exception直接捕获所有的 except Exception as e: # 可以匹配所有的错误类型 BaseException 是 Exception 的父类,也可以捕获所有类型 错误的处理代码 else: 当被检测的代码没有任何异常发生,才会执行这里面的语句 finally: 无论被检测的代码有没有异常发生,都会在代码执行完后执行这里面的代码

案例

try: safaf except NameError as e: print(e) else: print("没有报错才会执行我哦~") finally: print("管你报不报错,我都会执行的!") # name 'safaf' is not defined # 管你报不报错,我都会执行的! try: print("我没错哦~") except Exception as e: # 捕捉所有异常 print("管你啥错,我都抓了!") else: print("没有报错才会执行我哦~") finally: print("管你报不报错,我都会执行的!") # 我没错哦~ # 没有报错才会执行我哦~ # 管你报不报错,我都会执行的!

补充

出错后会立即停止代码运行,去与except中的错误类型一个个比较,匹配上了就执行里面的代码,没匹配上就直接报错

python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3

主动抛出异常raise if 'egon' == 'DSB': pass else: raise TypeError('尽说大实话') # 这一行就是报错的位置 # raise 关键字就是用来主动抛出异常的 断言assert

断言不成立直接报错

l = [1, 2, 3] assert len(1) < 0 # assert 断言,预言,猜某个数据的状态,猜对了不影响代码执行,猜错了直接报错 自定义异常(继承异常类)

报错类型,其实对应的就是一个个类(可以自定义拼接异常的格式)

class MyError(BaseException): def __init__(self, msg): super().__init__() self.msg = msg def __str__(self): return f'----<{self.msg}>----' raise MyError('自定义的异常') # Traceback (most recent call last): # File "E:/PyCharm 2019.1.3/ProjectFile/day010/day029/test.py", line 15, in <module> # raise MyError('自定义的异常') # __main__.MyError: ----<自定义的异常>---- UDP通信

UDP协议又叫用户数据报协议

它没有双向通道,类似于发短信(只管发,不管对方有没有收到,不需要对方立即回应)

UDP的程序可以先启动客户端再启动服务端(客户端发数据给服务端之前都没问题)

UDP类似于发短信

TCP类似于打电话,你一句我一句的

普通使用

服务端

import socket server = socket.socket(type=socket.SOCK_DGRAM) # type=socket.SOCK_DGRAM 指定成 UDP 协议 type=socket.SOCK_STREAM TCP协议(默认就是,不用指定) server.bind(('127.0.0.1', 8080)) # UDP 不需要设置半连接池(server.listen(5)),也没有半连接池的概念 # UDP 没有双向通道,所以也不需要建立连接(conn, addr = server.accept()) # 直接就是通信循环 while True: # 这里只需要直接通信(交互)即可 data, addr = server.recvfrom(1024) print("数据:", data.decode('utf-8')) # 客户端发来的消息 print("地址:", addr) # 客户端的地址 re_msg = input("Please input your response msg:").strip() # 会阻塞在这里,这里过了,才能发出信息,看到下一条信息 server.sendto(re_msg.encode('utf-8'), addr) # 向客户端发送消息 # 数据: hi # 地址: ('127.0.0.1', 64821) # Please input your response msg:o hi # 数据: hihihi # 地址: ('127.0.0.1', 64823) # Please input your response msg:xxixixi # 数据: aha e # 地址: ('127.0.0.1', 64828) # Please input your response msg:emmm? # 数据: # 地址: ('127.0.0.1', 64828) # Please input your response msg:adsa

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwszg.html