异常
对于程序运行过程中出现的不正常,我们要么称之为错误,要么称为异常,要么说程序没有按预期运行,在这里有一个统一的称谓-异常
什么是异常
最为Python的初学者,在编程过程中,经常会看到一些报错信息,使你编写的程序不能如期工作,例如:NameError、SyntaxError、TypeError、ValueError等
异常处理
当程序出现异常时,最简单的是使用try语句处理。
try语句的基本形式为try/except。用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。捕获异常的语法为:
try:
语句 #运行的语句
except 异常名字:
语句 #如果发生了对应的异常的操作
try的工作原理是,开始一个try语句后,Python就在当前程序的上下文中做标记,当出现异常时就可以回到做标记的地方。首先执行try子句,接下来发生什么依赖于执行时是否出现异常。如果try后的语句执行时发生异常,程序就跳回try并执行except子句。异常处理完毕,控制流就可以通过整个try语句了。
注意:如果没有处理异常,异常就会被传播到调用的函数中。如果在调用的函数中依然没有处理,异常就继续传播,直到程序的最顶层。也就是可以处理其他程序中未处理的异常。
我们可以一次处理多个异常语法如下:
try:
语句
except 异常名字1:
语句 #如果发生了异常名字1的异常的操作
except 异常名字2:
语句 #如果发生了异常名字2的异常的操作
这个与上一个不同之处在于,所以在这里有多个except但是最终并且只能执行一条异常。
我们也可以使用一个块捕捉多个异常-利用元组同时捕捉,语法如下
:
try:
语句
except (异常名字1,异常名字2,异常名字3):
语句 #如果发生了异常名字的异常的操作
抛出异常
Python使用raise语句抛出一个指定异常。我们可以使用异常类或实例参数调用raise语句引发异常,使用类时程序会自动创建实例。
如果只想知道是否抛出了异常,并不想处理,使用一个简单的raise语句就可以再次异常抛出。
Python重要的内建异常类
异常名称描述
Exception常规错误的基类
AttributeError对象没有这个属性
IOError输入/输出操作失败
IndexError序列中没有此索引
KeyError映射中没有这个键
NameError未声明/初始化对象
SyntaxError语法错误
SystemError一般解释器系统错误
ValueError传入无效的参数
捕捉异常对象
如果希望在except子句中访问异常对象本身,也就是看到一个异常对象真正的异常信息,而不是输出自己定义的异常信息,可以使用as e的形式,语法(实例)如下:
try:
语句
except 异常名称 as e:
print(e) #输出异常信息
注意:使用这种方式可以捕获多个异常
我们可以全捕捉,即不书写对应的异常名称,就可以将异常信息打印出来,但是一般不建议这样使用。
由此引出了,else,它的意图就是避免一些意想不到而except又没有捕获的异常。添加else子句做一些事情可以帮助我们更好的判断程序的执行情况。
自定义异常
尽管内建异常类包括了大部分异常,而且可以满足很多要求,但有时还是要创建自己的异常类。比如需要精确定位问题。可以通过创建一个新exception类拥有自己的异常。异常应该继承自Exception类,可以直接继承,也可以间接继承。
因为错误就是类,捕获一个错误就是捕获该类的一个实例,因此错误并不能凭空产生的,而是有一些不合理的部分导致的我们自己编写的异常函数也可以抛出错误。如果要抛出错误,那么可以根据需要定义一个错误的类,选择好继承关系,然后用raise语句抛出一个错误的实例。
finally子句
Python中的finally子句需要和try子句一起使用,组成try/finally的语句形式,无论try中的语句是否发生异常,都将执行最后的代码。
语法为:
try:
语句
except 异常名称1 :
print(e) #输出异常信息
finally:
语句
执行顺序为,先执行except子句的输出语句,后面跟着执行finally子句。如果在添加else子句,当程序正常运行时会先执行else子句,然后执行finally子句。finally子句在关闭文件或者数据库连接时非常有用。
领取专属 10元无门槛券
私享最新 技术干货