异常处理、套接字编程
一、异常处理:
1.1 什么是异常:
错误发生的信号,一旦程序出错就会产生一个异常
如果该异常没有处理,该异常就会被抛出来,程序的运行随机被终止
① 异常处理的三个组成:
异常追踪信息(具体哪一行代码抛出的的异常)、
异常的种类、
异常的内容信息
② 异常的类型:
NameError:引用了一个不存在的名字
AttributeError:访问了对象所没有的属性
IndexError :索引超出范围
KeyError:字典的key不存在
ValueError:传入的值的类型不正确
TypeError:传入对象的类型与要求的不符合
ZeroDivisionError:除数是0
IOError:输入/输出异常
ImportError:无法引入模块或包(一般是路径或者名称错误)
1.2 为何要处理异常:
为了增强程序的健壮性
1.3 异常处理:
1.3.1 针对语法的错误:
应该在程序运行前就立即改正
1.3.2 针对逻辑错误:
① 如果逻辑错误发生的条件是可以预知的,应该用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('必须输入数字')
② 如果逻辑异常发生的条件是不可预知的,考虑到程序的健壮性,应该用try…except:(在错误发生之后进行处理,做好补救措施)
try:
代码块(顶级代码)
except 异常的类型:
发生异常后要处理的代码
ps:异常抛出后会跳过同级别的后续块,直接到处理代码块
异常处理完毕会继续运行【处理代码】后续的代码
try:
print("====>111")
print("====>222")
x = 5
dic={}
dic["k1"]
print("====>333") # 因为上面的代码出现了逻辑错误,此行代码不会运行
x = 10 # 同上,不运行
except (NameError,IndexError) as e:
print("=---->",e)
except KeyError as e:
print(e) # 'k1'
print('====>4')
print(x) # 5
1.3.3 finally
注意点:代码块一定会运行
应用场景:通常被用来做清理工作,如关闭文件对象等
语法示例:
try:
print("====>111")
print("====>222")
finally:
print("====>3")
print('====>4')
1.3.4 万能处理
try … except exception
try:
print('xxx')
xxx
print('hello')
except exception as e:
print(e)
print(123) # 此行代码会继续运行
1.3.5 raise
作用:主动抛出异常
应用场景:在需要被覆盖定义的场景下使用,如果没有被覆盖就会报错
示例:(鸭子类型——自定义异常来约束规范)
如父类中定义的函数是提供标准的,不是给对象调用的,子类应该分别自定义函数覆盖使得子类的对象调用各自的函数:
class Animal:
def speak(self):
raise BaseException("小垃圾必须实现speak方法来覆盖")
def run(self):
raise BaseException("小垃圾必须实现run方法来覆盖")
class Dog(Animal):
def speak(self):
return '汪汪汪'
def run(self):
return 'pia pia pia'
class Pig(Animal):
pass
d=Dog()
p=Pig()
d.speak() # 正常运行
d.run() # 同上
p.speak() # 报错,因为没有定义speak函数来覆盖父类的函数
p.run() # 同上
1.3.6 assert 断言
作用:确保上面的代码满足定义的断言条件,否则抛出断言异常AssertError
应用场景:在协同开发程序的时候,前半段程序中的数据要与后面的数据耦合,在测试的时候可以使用断言来验证一下
names = ['cc', 'dd', 'ee']
assert len(names) == 3 # 确保上面定义的names列表有三个元素,否则抛出AssertError异常
print(names[2])
1.3.7 总结try…except:
① 把错误处理和真正的工作分开
② 代码更易组织、结构更加清晰,复杂的工作任务更容易实现
③ 提高程序的健壮性,使程序更加安全, 不至于因为一些小的疏忽使得程序意外崩溃
二、套接字编程
2.1什么是socket?
网络基础=》socket
2.2 socket编程的作用?
基于socket开发一个C/S或者B/S结构的软件
Client------------网络--------------Server(要写两端程序:客户端、服务端)
Browser---------网络--------------Server(客户端(浏览器)一般不需要自己写,写了也没有人会用 o(╥﹏╥)o )
2.3 如何基于socket编程?
网络:https://www.cnblogs.com/linhaifeng/articles/5937962.html
网络 = 底层的物理连接介质+互联网通信协议
网络存在的意义:
就是增强通信的便捷、快速
2.4 OSI七层协议
互联网按照功能不同,一般分为OSI七层 或者tcp/ip五层 或tcp/ip四层:
每层运行常见物理设备:
OSI七层协议的数据传输的封包与解包示意图: