异常处理和UDP协议
一、什么是异常?
程序在运行过程中出现了不可预知的错误,并且该错误没对应的处理机制,那么就会以异常的形式表示出来,
造成的影响就是整个程序无法再正常的运行,抛出异常。
二、异常的结构:
1:异常的类型:NameError
2:异常的信息:name 'sys' is not defined
3:异常的位置:File "E:/PY/异常处理机制.py", line 1, in <module>
三、异常的两类:
1:语法错误:
是程序就显示提示的错误,应该立即解决,这种错误是不能容忍的
2:逻辑错误:
这种错误一般是一眼看不出来的,是可以被容忍的,针对逻辑上的错误,是可以采用异常处理机制进行捕获的
四、常见的错误类型:
名字错误:NAMERROR
键不存在:KeyError
值错误:ValueError
索引错误:IndexError
语法错误:SyntaxError
......
五、如何避免?
异常处理:在认为可能会出现bug的代码块上方用 try一下,要注意的是try 里的内容越少越好:
异常处理机制的固定语法:
try:
可能出错的代码
.......
except 出错的类型 as e: # 将报错的信息赋值给变量e
>>出错后的处理机制
六、python常用的内置异常:
所有异常的超类:BaseException
BaseException是所有内置异常的基类,但用户定义的类不能直接继承BaseExpxeption,所有的异常类都是从Exception继承,且都在exceptions模块中定义.
class MyError(Exception):
def __init__(self,msg):
self.msg= msg
def __str__(self):
return self.msg
try:
raise MyError("类型的错误!")
except MyError as e:
print("my exception occurred",e.msg) >>>
my exception occurred 类型的错误!
七、异常的捕获:
python的异常捕获常用try...except...结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有:
try/except 捕获异常并处理
pass 忽略异常
as 定义异常实列(except MyError as e)
else 如果Try 中的语句没有引发异常,则会执行else中的语句
finally 无论是否出现异常,都执行的代码
raise 主动抛出/引发异常
try:
l = [1,2,3,4]
l[1221544] # 语法错误
except Exception:
print("看你还能怎么玩!") # 有错就执行这一行
else:
print("无所谓的啦") # 没错就执行这一行代码
finally:
print("无论被检测的代码有没有异常发生 都会在代码运行完毕后执行我") # 无论有没有错都执行这一行代码
raise 主动抛出/引发异常
class MyError(BaseException):
def __init__(self,msg):
super().__init__()
self.msg= msg
def __str__(self):
return '<苏喂苏喂>' %self.msg
raise MyError("我自己定义的异常:") # 主动抛出异常
万能异常:所有的异常类型都被捕获
try: <语句> except Exception: print('异常说明')
raise主动触发异常:
raise MyError('我自己定义的异常') # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法
八、基于UDP协议的socket
udp协议是无连接的,启动服务后可以直接接受消息,不需要提前建立连接
UDP的特点:
数据报协议(自带报头),所以客户端发送的内容可为空,报头里自带一部分的内容
没有双向通道,通信类似于发短信
1:udp协议客户端允许发空
2:udp协议不会黏包
3:udp 协议服务端不存在的情况下,客户端照样不会报错;
4:usp 协议支持并发
可以用代码来验证以上四点特点
UDP基本功能的使用:
服务端server:
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)
客户端:clienct
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)
简单的实现了以上的而几个功能特点,
并发,多个客户端同时进行访问,
不报错: 断开服务器是客户端也能进入待输入的界面,类似于发短信,我发了,不管你收不收得到看不看
允许发空,因为它有一个特点就是自带报头,即使什么也不输入,内容也不为空,报头里自带有一小部分内容,
不像TCP协议,它没有双向通道,不需要先建立三次握手,四次握手手动断开那么复杂,直接就交互
并发概念:看起来像同时运行(客户端看似在同时访问,其实是有时间的间隔,只是比较短)
并行概念:真正意义上的同时运行
UDP协议类似于发短信
TCP协议类似于打电话
总结
黏包现象只发生在tcp协议中:
1.从表面上看,黏包问题主要是因为发送方和接收方的缓存机制、tcp协议面向流通信的特点。
2.实际上,主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的
九、socketserver 模块
利用socketserver模块,可以解决TCP协议实现看起来像UDP一样并发,就是客户端同时访问
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
client.send(b'hello')
data = client.recv(1024)
print(data.decode('utf-8'))
客户端
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
print("苏喂")
while True:
data,sock = self.request
print(self.client_address) # 客户端地址
print(data.decode('utf-8'))
sock.sendto(data.upper(),self.client_address) if __name__ == '__main__':
"""只要有客户端连接,会自动交给自定义类中的handle方法中"""
server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),Myserver)
# 创建一个基于TCP的对象
server.serve_forever() # 启动该服务对象
服务端
重点;
用tcp实现
上传文件下载文件的操作
异常处理和UDP协议的更多相关文章
- 异常处理和UDP Socket套接字
一.异常处理 1.什么是异常处理: 程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表达出来,造成的影响就是整个程序无法再正常进行. 2.异常的结构: 1.异常 ...
- C++复习8.异常处理和RTTI
C++异常处理和RTTI技术 20130930 1.异常处理的基本知识 C语言中是没有内置运行时错误处理机制,对于错误发生的时候使用的几种处理机制: 函数返回彼此协商后统一定义的状态编码来表示操作成功 ...
- C异常处理和C++异常处理的对比
每一种编译器实现异常处理的方式会有所不同,但是都是基于Windows的SEH异常处理.这里以MSC编译器为例. C异常处理 #include <Windows.h> int main(in ...
- 进击的Python【第七章】:python各种类,反射,异常处理和socket基础
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- Python之异常处理和socket套接字连接7
一.异常处理 1)异常处理的使用意义 什么是异常处理 异常是程序发生错误的信号,即程序一旦出错就会立刻产生一个异常,如果该异常没有被处理 那么异常就抛出来,程序的运行也随之终止 异常分为三部分: 异常 ...
- python之异常处理和re模块补充
一.re模块的补充 1.从一个字符串中获取要匹配的内容 findall:返回一个列表 2.search ***** 验证用户输入内容 '^正则规则$':返回一个对象,用group()取值 3.matc ...
- 异常处理和JDBC
1.异常: 格式:try{ 要执行的可能出现异常的语句 } catch(Exception e){ 对异常进行处理的语句 } finally{ 一定会被处理的语句 //可以不写 } 当需要 ...
- 异常处理和Throwable中的几个方法
package cn.lijun.demo; /* * try { //需要被检测的语句. } catch(异常类 变量) { //参数. //异常的处理语句. } finally { //一定会被执 ...
- python基础之 异常处理和logging模块
1.异常处理 l = ['apple','admin','kobe'] for id,item in enumerate(l,1): print(id,item) try: choose_id = i ...
随机推荐
- 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)
集合详解: /* Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢. ...
- JDK1.8 HashMap学习
1:源码分析 1.1:构造方法 public HashMap(int initialCapacity, float loadFactor) { ) throw new IllegalArgumentE ...
- 吴裕雄--天生自然 PHP开发学习:echo 和 print 语句
<?php echo "<h2>PHP 很有趣!</h2>"; echo "Hello world!<br>"; ec ...
- day25(025-多线程(下)&GUI)
线程状态图 ###25.01_多线程(单例设计模式)(掌握) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.priva ...
- POJ - 1631 Bridging signals(最长上升子序列---LIS)
题意:左右各n个端口,已知n组线路,要求切除最少的线路,使剩下的线路各不相交,按照左端口递增的顺序输入. 分析: 1.设左端口为l,右端口为r,因为左端口递增输入,l[i] < l[j](i & ...
- CodeForces - 748C Santa Claus and Robot
题意:机器人在网格线上行走,从p1点开始,沿最短路径到p2,再沿最短路径到p3,依此类推.在此过程中留下了行走的运动轨迹,由“RLDU”表示.问若只给出运动轨迹,求最少的pi点的个数. 分析:pi到p ...
- 18 12 2 数据库 sql 的增删改查
---恢复内容开始--- 1 开始进入MySQL 的安装 https://www.cnblogs.com/ayyl/p/5978418.html 膜拜大神的博客 2 默认安装的时候 m ...
- OpenStack(四)——使用Kolla部署OpenStack多节点云
(1).实验环境 主机名 IP地址 角色 内存 网卡 CPU 磁盘 OpenStack-con 192.168.128.110 controller(控制) 8G 桥接网卡ens32和ens33 4核 ...
- python基础1--基本数据类型+流程控制
一.基本数据类型 1.整型 int 就是整数 2.浮点型 float 就是小数 3.字符串 3.1.加了单引号.双引号.多引号的字符就认为是字符串 单引号和双引号没有什么区别,多引号用 ...
- pywin32获得tkinter窗口句柄,并在上面绘图
想实现用win32 API在tkinter窗口上画图,那么应该先获得tkinter窗口的句柄hwnd,然后再获得tkinter的设备hdc.尝试了FindWindow(),GetActiveWindo ...