一、异常处理
什么是异常
异常是错误发生的信号,一旦程序出错就会产生一个异常。如果该异常没有被处理,该异常就会被抛出,程序也会随之终止。(前面的代码会正常运行)
异常的三个组成部分
1.具体哪一行代码抛出的异常
2.异常的种类(如NameError)
3.异常的内容信息
如何处理异常
1.语法错误:Syntax Error,如我们在使用if 时忘记了最后的括号,这种错误只能自己在程序运行前后改正
2.逻辑错误:逻辑错误有很多的情况,如:NameError,KeyError 等。具体情况要具体分析,因为逻辑错误是无法避免的。
针对逻辑错误:
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.如果异常是不可预知的,如我们以后在开发时,在通信数据交互时,服务端断电或者断网,我们无法预知到底是什么情况发生,或者在使用迭代器时,我们并不知道迭代器是否取完了值,我们应该做好异常处理,完善补救措施。在try后面的代码块,是属于全局级别的代码,在except后面的代码块,可以用来放一些补救措施的代码或者打印错误信息到日志中,方便日后排除。
正常异常处理代码格式如下:
try:
代码
except 异常类型:
发生异常后的代码
# 可以打印错误的内容
except 异常类型 as e:
print(e)
except 异常类型:
发生异常后的代码
# 若有针对好几种错误类型要进行统一的处理
except (异常类型1,异常类型2,异常类型3):
发生异常后的代码
else:
未发生异常运行的代码
finally: # 一般用来回收资源,防止异常发生后,后续代码无法运行使得系统资源无法回收
无论是否发生异常都会运行的代码
常见的逻辑错误种类:(平时要多记)
NameError:变量名未定义
IndexError:索引不存在
KeyError:键不存在
AttributeError:通过类与对象访问其属性不存在
ValueError:值错误,如int("ahiva")
TypeError:类型错误,如'ab'+2
万能异常
Exception(与任何类型都能匹配)
try:
x = 1
except Exception as e:
print(e)
主动抛出异常
raise NameError("变量名未定义") # 在类中可用于定制规范
我们封装类,会隐藏类的属性,且对外提供接口限制用户的输入,比如我们想要的age属性,应该是整型,但是用户(注意我们的用户也是程序员,因为真的用户根本就不可能来操作你的对象)可能会输入一串字符,当然我们之前用if判断,可以提醒用户,但是这种做法并不强势,如果是有很多的逻辑代码,因为提醒用户之后,代码还在正常运行。等到很久以后,用户需要了age这个属性的时候,才会发现age没有设置,找的时候又很麻烦,而如果使用raise,我们就可以强制用户输入正常的类型,不然程序直接崩溃。
其实这个方法就与之前我们用abc模块来实现子类必须实现父类方法的效果一样,都是通过强硬的手段达到使用者必须完成某个功能的效果。
print('==>11')
raise ExceptionError("遵守规范呀小老弟")
print('==>222')
自定义异常类型
可以自己定义异常类型的名字,接受的参数,输出信息的格式等等。
常常与raise搭配使用
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)
# python的类与C语言的结构体很相似
断言
assert,断言。一般用在测试程序时,当真正程序上线后应该删除断言。
我们在开发时候,经常是合作开发,若我们需要完成的功能需要他人写的功能传递数据,但是因为某些原因,本来应该传过来三个参数变成了两个参数。当然我们可以使用if判断,但是可能后续有几千行代码,全部缩进到一个if判断中并不现实。此时就可以使用断言。
printt(1)
x = 1
assert x == 1: # assert 条件:
print(x)
如果断言成功,正常运行后续代码,断言失败,抛出异常。