Python中的异常处理和套接字编程Socket
Python学习之从入门到放弃,喜欢的可以关注一下哦。
异常处理
1 什么是异常?
- 异常是错误发生的信号,一旦程序出错就会产生一个异常。
- 如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止
异常的组成部分:
1.具体哪一行代码抛出的异常
2.异常的种类
NameError:变量名没有定义过
IndexError:索引不存在
l=[11,22]
l[100]
KeyError
d={"k1":11}
d["k2"]
AttributeError:对象属性不存在
对象.属性
ValueError:
int("asdf")
TypeError:
"asdf"+1111
ZeroDivisionError
1/0
等等....
3.异常的内容信息
示例:代码报错内容
Traceback (most recent call last):
File "E:/code/s15-day28/01 异常处理.py", line 195, in <module>
assert len(salaries) == 3
AssertionError
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 异常的类型:
发生异常后要执行的代码
示例异常处理:
1.接收的异常必须是程序所抛出的异常:
try:
print("====>111")
print("====>222")
xxx #异常处
print("====>333")
except AttributeError as e:
print(e)
print('====>4')
结果:
====>111
====>222
Traceback (most recent call last):
File "E:/code/s15-day28/01 异常处理.py", line 64, in <module>
xxx
NameError: name 'xxx' is not defined
#异常类型是NameError 不是AttributeError 所以异常没有被接收到。
2.用正确的异常报错去接收抛出的异常:
try:
print("====>111")
print("====>222")
xxx
print("====>333")
except NameError as e:
print(e)
print('====>4')
结果:
====>111
====>222
name 'xxx' is not defined
====>4
as e 表示的是接收所抛出的异常,并且赋值给e
再打印出来用 print(e)
3.多异常接收 1:
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')
结果
====>111
====>222
'k1'
====>4
#如果把 xxx 解除注释。我们需要注意,不会执行下面其他的异常,只会执行NameError异常
====>111
====>222
=----> name 'xxx' is not defined
====>4
4.finally:
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)
结果:
====>111
====>222
====>333
一定会运行 #不管程序报不报错,都会执行finally
====>4
111
#还有我们要注意在try 中的代码还是顶级代码,可以看print(xxx)这个代码
注意:
无论异常与否,都会执行该模块,通常是进行清理工作
5.万能异常 Exception:
try:
print("====>111")
print("====>222")
# xxx
l=[]
# l[0]
dic={}
dic["k1"]
print("====>333")
except Exception as e:
print("万能异常",e)
print('====>4')
结果
====>111
====>222
万能异常 'k1'
====>4
6.主动触发异常 raise:
print('==>11')
raise NameError("变量名未定义")
print('==>222')
结果
Traceback (most recent call last):
File "E:/code/s15-day28/01 异常处理.py", line 144, in <module>
raise NameError("变量名未定义")
NameError: 变量名未定义
==>11
主动触发异常的应用场景:
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()
在公司里多人一起写代码的时候,我们可以适用报异常的方法,希望适用鸭子类型去定义类,那么我们就必须要每个类中都有相对应的代码,用主动触发异常的方式可以提醒各位,需要取覆盖此功能。就不必我们去调用abc模块了
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)
结果
Traceback (most recent call last):
File "E:/code/s15-day28/01 异常处理.py", line 181, in <module>
raise Interface("接口异常", 11, 22, 33)
__main__.Interface: <接口异常:11:22:33>
8.断言:assert 条件
salaries=[1984,2752]
# if len(salaries) != 3:
# raise NameError
assert len(salaries) == 3
print(salaries[0])
print(salaries[1])
print(salaries[2])
结果
Traceback (most recent call last):
File "E:/code/s15-day28/01 异常处理.py", line 190, in <module>
assert len(salaries) == 3
AssertionError #断言错误。
其实断言效果就是相当于if判断。
9.总结try…except
- 1:把错误处理和真正的工作分开来
- 2:代码更易组织,更清晰,复杂的工作任务更容易实现
- 3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了
套接字编程
1.什么是socket?
网络基础=》socket
2、为何要学习socket编程:
基于socket开发一个C/S或者B/S结构的软件
Client---------网络------------Server
Browser--------网络------------Server
3、如何基于socket编程
**网络:**https://www.cnblogs.com/linhaifeng/articles/5937962.html
3.1网络是什么?
底层的物理连接介质+互联网通信协议
OSI七层协议
3.2网络存在的意义是什么?
通信
4、OSI七层协议
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
如图:
OSI七层协议数据传输的封包与解包过程
如图:
努力学习!