一、异常
1、异常:程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止。异常是类的实例,实例可以被引用,并且可以进行捕捉,进而使得错误被处理。
如果没有处理异常,异常就会向上传播直到顶层。也就是说,可以在顶层处理程序中的异常。
2、一个异常分为三部分: ①异常的追踪信息 ②异常的类型 ③异常的值
3、排查错误: Ⅰ 定位到错误发生的位置 查看追踪信息 1、代码全是自己写的,没有调用内置或第三方的内容,错误一定在最后一行 2、如果代码调用了内置或第三方 ①调用的系统内置模块,例如抛出位置在object.py(系统内置),可能是你在调用时的参数出错。 ②第三方模块可能真的存在错误,可以按照追踪信息检查问题。 如果有很多追踪信息,首先查看最后一行。 Ⅱ 查看异常类型 Ⅲ 查看异常的值 如果没有任何异常信息,但是程序运行还是有问题,那么就使用排除法(一段一段运行)
4、异常的分类: Ⅰ 语法异常: 解释器在执行代码前会先检测语法,检测通过才会开始执行,否则一行都不会执行。 这类异常应该在程序执行前就改正
Ⅱ 逻辑上的异常(运行时的异常) 通过语法检测,在解析执行期间发生异常。
5、异常完整的书写顺序
try except # 可以有多个 else finally
最简单的形式:
try:
print(1) # 此句会执行
a = int("abc")
print(2) # 此句不会执行
except ValueError:
print("我是谁?我在哪?")
print("over") # 因为上面的异常可以被捕捉到,所以程序可以继续执行。此句会执行。如果异常没被捕捉处理,那么此句不会执行。
输出结果:
1
我是谁?我在哪?
over
可以有多个except
try:
"要执行的语句块"
except ValueError:
print("我是谁?我在哪?")
except IndexError:
print("我又是谁?我又在哪?")
在一个except中可以有多个异常类型,写成元组的形式。
try:
"要执行的语句块"
except (ValueError,IndexError):
print("我是谁?我在哪?")
万能异常Exception ,不经常使用,会导致虽然不报错,但程序功能无法实现。
try:
"要执行的语句块"
except Exception:
print("所有错误都是Exception的子类")
可以通过给异常取别名来获取异常信息:
try:
a = int("wer")
except Exception:
print("所有错误都是Exception的子类")
try:
a = int("wer")
except Exception as e:
print(e)
输出结果分别为:
所有错误都是Exception的子类
invalid literal for int() with base 10: 'wer'
先捕获能够明确的异常类型,最后捕获万能异常类型
try:
print('start.....')
l=[]
l[3]
print('end....')
except NameError as e:
print('NameError: ',e)
except KeyError as e:
print('KeyError: ',e)
except Exception as e:
print('万能异常---》',e)
print('other.....')
输出结果为:
start.....
万能异常---》 list index out of range
other.....
try....else... else: 不能单独使用,必须与except连用,else的子代码块会在被检测的代码没有出现过任何异常的情况下执行。else语句块要放到最后。
try:
print('start.....')
print('end....')
except NameError as e:
print('NameError: ',e)
except Exception as e:
print('万能异常---》',e)
else:
print('在被检测的代码块没有出现任何异常的情况下执行')
print('other.....')
输出结果:
start.....
end....
在被检测的代码块没有出现任何异常的情况下执行
other.....
try...finally... 无论发不发生异常,finally内的子代码块都会执行。 finally的子代码块通常用于回收系统资源
import io
try:
print("start")
f = open("1220test","rt",encoding="utf-8")
f.read()
print("end")
except FileNotFoundError:
print("文件路径错误...")
except io.UnsupportedOperation:
print("文件不能被写入....")
finally:
f.close()
print(f.closed) # 验证文件是否关闭
输出结果:
start
end
True
正确使用异常: 1、如果明确知道异常发生的原因,就不要产生异常,使用if判断等条件 2、不知道异常发生的原因,但是知道异常的类型,那就明确捕获该类型的异常 3、不知道发生的原因,也不知道异常的类型,可以使用万能异常,但是一定要打印异常信息。
主动抛出异常:
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
输出结果:
类型错误
自定义异常类:
# 自定义异常类:
class LoginException(Exception):
pass
def login():
name = input("name:").strip()
pwd = input("password:").strip()
if name == "aaa" and pwd == "123":
print("登陆成功!")
else:
raise LoginException("用户名或密码不正确")
login()
class EgonException(BaseException):
def __init__(self,msg): # 初始化
self.msg=msg
def __str__(self): # 打印对象时就会调用这个方法
return self.msg # 返回字符串
try:
raise EgonException('类型错误')
except EgonException as e:
print(e)
二、assert
assert 断言。 用来简化代码,后接布尔值表达式,如果为真则执行下面的代码;如果为假则直接抛出异常。 局限性:异常类型是固定的,且不能指定异常信息。
names = ["张三","李四","王麻子"]
# 一定要保证列表中有数据需要被处理
if not names:
raise TypeError("没有数据需要处理....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
输出结果:
正在处理这堆数据....
正在处理这堆数据....
正在处理这堆数据....
names = []
# 一定要保证列表中有数据需要被处理
if not names:
raise TypeError("没有数据需要处理....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
输出结果:
Traceback (most recent call last):
File "C:/Users/wangt/PycharmProjects/20181220/1220test.py", line 188, in <module>
raise TypeError("没有数据需要处理....")
TypeError: 没有数据需要处理....
assert 1 # 即断言为真
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
输出结果:
正在处理这堆数据....
正在处理这堆数据....
正在处理这堆数据....
assert 0 # 即断言为真
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
Traceback (most recent call last):
File "C:/Users/wangt/PycharmProjects/20181220/1220test.py", line 184, in <module>
assert 0
AssertionError
三、网络编程之网络协议
网络编程:编写基于网络的应用程序的过程称为网络编程。
C/S构架 :我们把提供数据的一方称之为服务器(Server),把访问数据的一方称为客户端(Client)。
网络连接需要两个基本要素:物理连接介质,通讯协议。
osi七层模型:
①物理层:包括光缆等。
作用是:基于电子器件发送电流信号,根据电流的高低可以对应到数字0和1,也就是二进制数据。
②数据链路层
由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思。
以太网协议规定如下:
一组电信号构成一个数据包,叫做‘帧’。
每一数据帧分成:报头head和数据data两部分。