什么是异常呢?
异常既是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。就是程序在运行
过程中出现了不可预知的错误,一般情况下,在python无法正常处理程序时就会发生一个异常。并且
该错误没有对应的处理机制,那么就会以异常的形式表现出来;异常是python对象表示了一个错误,当
出现错误时我们需要去捕获它,否则程序就会终止运行
异常的种类分为两大类:
1.语法错误
是你在程序上能够立马解决的 但是这种错误不能被容忍 语法上的错误发现之后要立刻决。
2.逻辑错误
这种错误是可以被容忍的,因为一眼看不出来,针对逻辑上的错误可以采用异常处理机制进行捕获。
常见的错误类型:
OverflowError | 数值运算超出最大限制 |
AttributeError | 对象没有这个属性 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
NAMERROR | 名字错误 |
SyntaxError | 语法错误 |
ValueError | 值错误 |
IndexError | 索引错误 |
ImportError | 导入模块/对象失败 |
如何避免异常呢:
在我们认为可能出现bug的代码块上方try一下,要注意的是try内部的代码块越少越好
语句结构:
try:
可能出现的代码
except 出错的类型 as f: # 将保错信息赋值给变量f as 后面跟的是自定义的变量名
出错之后的处理机制
try:
<statements> #运行try语句块,并试图捕获异常
except <name1>:
<statements> #如果name1异常发现,那么执行该语句块。
except (name2, name3):
<statements> #如果元组内的任意异常发生,那么捕获它
except <name4> as <variable>:
<statements> #如果name4异常发生,那么进入该语句块,并把异常实例命名为variable
except:
<statements> #发生了以上所有列出的异常之外的异常
else:
<statements> #如果没有异常发生,那么执行该语句块
finally:
<statement> #无论是否有异常发生,均会执行该语句块。
try-finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally 子句不可以省略一定不存在except 子句
作用:
通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子
句都会被执行try-finally 语句不会改变程序的(正常/异常)状态
try:
异常语句1
异常语句2
异常语句3
except Exception: # 万能异常 所有的异常类型都能捕获。
其它异常处理语句
else:
未发生异常语句
finally:
最终语句
作用:
偿式捕获异常,得到异常通知,将程序由异常流程转为正常流程并继续执行
UDP通信:
UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法,也被称为数据
报协议,它自带报头,没有双向通道,通信类似于发短信,当数据接收方收到发送方传来的信息
时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否
则将一直等待直到收到确认信息为止。
基于以上特性:
udp协议客户端允许发送空包
udp协议不会黏包
Udp协议服务端不存在的情况下客户端照样不会报错 就是如果在从发送方到接收方的传递
过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。
udp协议支持并发 并发就是在操作系统中,是指一个时间段有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。并发是看起来像同时运行。
UDP基本使用:
# 客户端.py文件演示:
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
# 不需要建立连接 直接进入通信循环
server_address = ('127.0.0.1',8080)
while True:
client.sendto(b'hello',server_address)
data, addr = client.recvfrom(1024)
print('服务端发来的数据',data)
print('服务端的地址',addr)
# 服务端.py文件演示:
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # UDP协议
server.bind(('127.0.0.1',8080))
# UDP不需要设置半连接池 它也没有半连接池的概念
# 因为没有双向通道 不需要accept 直接就是通信循环
while True:
data, addr = server.recvfrom(1024)
print('数据:',data) # 客户端发来的消息
print('地址:',addr) # 客户端的地址
server.sendto(data.upper(),addr)