一、异常
1、异常就是程序运行时发生的错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)
错误分两种,语法错误,逻辑错误
一个异常分为三部分:
1、异常的追踪信息2、异常的类型3、异常的值
2、异常的种类
常用异常
attributerError 试图访问一个对象没有的树形比如foo.x,但foo没有属性x
IOError 输入、输出异常,基本上是无法打开文件
importError无法引入模块或包;基本上是路径问题名称错误
IndexError 下标索引超出序列边界,比如当X只有三个元素,却试图访问X[5]
KeyError试图访问字典里不存在的键
NameError使用一个还未被赋予对象的变量
TypeError传入对象类型与要求的不符合
valueError传入一个调用者不期望的值,即使值的类型是正确的
语法:
单分支
try:
print('start.....')
x=1
y
l=[]
l=[3]
print('end....')
except NameError:
print('变量名没有定义')
多分支
try print('start.....')
x=1
# y
l=[]
l[3]
d={'a':1}
d['b']
print('end....')
except NameError:
print('变量名没有定义')
except KeyError:
print('字典的key不存在')
except IndexError:
print('索引超出列表的范围')
多种异常采用同一段逻辑处理
try:
print('start.....')
x=1
y
l=[]
l=[3]
print('end....')
except(NameError,KeyError,IndexError):
print('变量名或者字典的key或者列表的索引有问题')
万能异常
try:
print('start.....')
x=1
# y
l=[]
# l[3]
d={'a':1}
# d['b']
import os
os.aaa
print('end....')
except Exception:
print('万能异常---》')
获取异常的值
try:
print('start.....')
x=1
y
l=[]
l[3]
d={'a':1}
d['b']
import os
os.aaa
print('end....')
except Exception as e:
print('万能异常---》',e)
try....else....
else:不能单独使用,必须与except 连用,意思是:else的子代码地块会在被检测的代码没有出现过任何异常的情况下执行
try:
print('start.....')
x=1
y
l=[]
l[3]
d={'a':1}
d['b']
import os
os.aaa
print('end....')
except NameError as e:
print('NameError: ',e)
except KeyError as e:
print('KeyError: ',e)
except Exception as e:
print('万能异常---》',e)
else:
print('在被检测的代码块没有出现任何异常的情况下执行')
print('other.....')
try...finally....
try:
print('start.....')
x=1
# y
l=[]
l[3]
d={'a':1}
d['b']
import os
os.aaa
print('end....')
except NameError as e:
print('NameError: ',e)
except KeyError as e:
print('KeyError: ',e)
except Exception as e:
print('万能异常---》',e)
else:
print('在被检测的代码块没有出现任何异常的情况下执行')
finally:
print('无论有没有异常发生,都会执行')
print('other.....')
finally的子代码块中通常放回收系统资源的代码
try:
f=open('a.txt',mode='w',encoding='utf-8')
f.readline()
finally:
f.close()
主动触发异常
raise TypeError('类型错误')
class People:
def __init__(self,name):
if not isinstance(name,str):
raise TypeError('%s必须是str类型'%name)
self.name=name
断言
print('part1........')
stus=['egon','alex','wxx','lxx']
stus=[]
if len(stus) <= 0:
raise TypeError
assert len(stus) > 0
print('part2.........')
print('part2.........')
print('part2.........')
自定义异常
class RegisterError(BaseException):
def __init__(self,msg,user):
self.msg=msg
self.user=user
def __str__(self):
return '<%s:%s>' %(self.user,self.msg)
raise RegisterError('注册失败','teacher')
二、网络编程
1、C/S、B/S 架构
client---server
browser---server
2、什么是网络?
1、物理连接介质
2、互联网协议
互联网协议就是一堆标准
比喻:互联网协议就是计算机界的英语
数据传输就是先包一层源和目的端口,再包一层源IP和目标IP,再包一层源MAC和目标MAC,通过网络接口层和对端PC通信,对端再一层一层解包最后得到相应的数据,先通过IP到局域再通过局域找到MAC再通过端口找到客户端对应的用户软件
2.3.1 物理层
物理层由来:上面提到,孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计算机之间必须完成组网
物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
2.3.2 数据链路层
数据链路层由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
数据链路层的功能:定义了电信号的分组方式
以太网协议:
早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet
ethernet规定
- 一组电信号构成一个数据包,叫做‘帧’
- 每一数据帧分成:报头head和数据data两部分
head | data |
head包含:(固定18个字节)
- 发送者/源地址,6个字节
- 接收者/目标地址,6个字节
- 数据类型,6个字节
data包含:(最短46字节,最长1500字节)
- 数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送