本周内容:
day01
01 异常处理
02 socket编程
网络基础:OSI七层协议
day02
01 网络基础
02 socket编程
基于tcp协议的套接字编程
day03
01 粘包问题
02 基于udp协议的套接字通信
day04
01 sockserver编写支持并发的套接字
day05:
猴子补丁
垃圾回收机制
内置函数
单例模式
元类
==============================> 异常处理 <===================================
1、什么是异常
异常是错误发生的信号,一旦程序出错就会产生一个异常
如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止
错误分类:
语法错误:
逻辑错误:
抛出异常后,程序执行结束,其后的代码不会执行
补充:
程序执行前,先进行语法扫描(只扫描语法错误,不检测逻辑错误,所以语法错误之前的代码会执行),语法通过后再执行
异常信息由三部分组成
1、追踪信息(具体哪一行代码抛出的异常)
2、类名(异常的种类)
NameError:变量名没有定义过(NameError:变量名事先没有绑定一个值
)
IndexError:索引不存在
l=[11,22]
l[100]
KeyError
d={"k1":11}
d["k2"]
AttributeError:对象属性不存在
对象.属性
ValueError:
int("asdf")
TypeError:
"asdf"+1111
ZeroDivisionError
1/0
3、内容(异常的内容信息)
例1
try:
print("====>111")
print("====>222")
xxx
print("====>333")
except AttributeError as e:
print(e)
print('====>4')
例2
try:
print("====>111")
print("====>222")
xxx
print("====>333")
except NameError as e:
print(e)
print('====>4')
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 异常的类型:
发生异常后要执行的代码
4. 异常语句
try:
...
except 异常名 as e: 把异常得到的内容 赋给 e
注意:
try中抛出异常以后的代码不会运行
try之外的代码正常运行
异常的多分支:
也可在一个try中 except检测多个异常
except (NameError,IndexError) as e:
等效于
except NameError as e:
except KeyError as e:
注意:e 只在excep的子代码块中有效
# 例3
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')
finally:无论发不发生异常都会执行
通常用于测试代码时进行无效的内存回收(因为出错之后,这些内存就成垃圾了,如果不手动清垃圾则会占用内存资源)
# 例4
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)
# 例4 能正常运行,但是没有任何意义,属于多余的垃圾
try:
print("====>111")
print("====>222")
finally:
print("一定会运行")
print('====>4')
# print(xxx)
完整的异常语句:
try:
...
except 错误类型 as e:
...
finally:
一定会运行的内容(通常用于内存回收)
万能异常类型:Exception
无论什么类型的错误都能匹配到
用于:对所有类型的异常,都做相同的处理
# 例5
try:
print("====>111")
print("====>222")
# xxx
l=[]
# l[0]
dic={}
dic["k1"]
print("====>333")
except Exception as e:
print("万能异常",e)
print('====>4')
raise 主动抛出异常
NameError('自定义的显示内容')
补充:
类的设计者
类的使用者:程序员
raise主要作用于 程序员
强制让下面的程序员 遵循上面程序员制定的规范
or 测试自己写的代码是否正常(本意是不希望有异常出现)
例6
print('==>11')
raise NameError("变量名未定义")
print('==>222')
例7
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()
自定义异常: 通过继承BaseException
继承是 is-a ,通过继承确定 当前类是一个异常类
继承之后,可以重写父类的方法
例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)
断言:
主要用于测试代码时候用,测试完之后,这些额外添加的断言代码删除
assert 条件
assert:条件不成立时,底层调用一个raise,抛出一个异常AssertionError
例8:
print("====1")
print("====2")
print("====3")
salaries=[1.1,2.2]
# if len(salaries) != 3:
# raise NameError
assert len(salaries) == 3
print(salaries[2])
print(salaries[2])
总结:
对于可预知:用 if
对于不可预知:用try except
用在无法预料是否发生异常的场景
比如通信时,无法预知对方什么时候是否能接收到信息
能不用try就不用
================================> 套接字编程socket <====================================
1、什么是socket
网络基础==>socket
2、为何要学习socket编程:
基于socket开发一个C/S或者B/S结构的软件
Client---------网络------------Server
Browser--------网络------------Server
C/S架构:
Client------网络-------Sever
客户端Client 需要一个程序
不同平台的PC端、不同平台的手机端
开发微信小程序,其实就是调用微信的功能,与自己的服务端进行通信
服务端Sever 需要一个程序
把三层架构拆分在两个端
客户端: 视图层
(和客户打交道)
服务端: 接口层、数据层
(数据处理)
B/S架构:
Browser------网络--------Server
(浏览器)
CS架构比较灵活,自己都能定义
BS架构,需要遵循浏览器的标准
-------------------
标准:大家都是用的统一的规则
只要遵循这个标准,大家就可以无限制进行通信、交流
互联网通信协议(标准):计算机界的英语
3、如何基于socket编程
网络:https://www.cnblogs.com/linhaifeng/articles/5937962.html
网络是什么=底层的物理连接介质+互联网通信协议
OSI七层协议
网络存在的意义=》通信
4、OSI七层协议
每一层拿到原始数据(应用程序交予的数据)后,包上本层相关信息,送给下一层
如此一层层下去,直至数据链路层
物理层 把收到的东西打散成二进制,传输到目标计算机
目标计算机的物理层 把打散的二进制组织一起,送到链路层
每一层都认识本层的包装,拆开本层的包装,送到上一层
如此一层层下去,最终把数据送到应用程序
8-10-异常处理、套接字socket
最新推荐文章于 2022-03-17 17:41:16 发布