异常:程序运行过程中由外部问题(硬件错误,输入错误)引起的异常事件。
捕获异常
语法:
try:
<语句>
except <名字>:#异常1名字
<语句> #发生异常后执行的语句
else:
<语句> #没有发生异常时执行的语句
finally:
<语句> #无论是否发生异常,结束时执行的语句
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
示例:
打开一个不存在的文件,会报fileNotFoundError
用try语句捕获这个异常,
else语句是在没有异常的情况下执行的
拓展:
FileNotFoundError本质是一个异常类。
所有的异常,本质都是一个类。
异常类的树形表如下:
解读一下就是,FileNotFoundError的父类是OSError,OSError的父类是Exception类(大多数异常类的父类都是Exception),而终极boss是BaseException类(再往上就是Object类了)
明白这一点的意义有两个:
第一:当你想捕获一个异常,又不确定会遇到什么异常的时候,可以直接except Exception,因为按照类的继承原则,这条语句可以接收所有以它为父类的异常。
第二:你可以自己写一个异常类了。
定制异常了解一下~
定义一个类,继承Exception,它就成了异常类。
调用过程给了一个简单的示范,当文件不存在时,抛出TestException异常,然后在下面捕获,进行相应操作就可以。
抛出异常
在进行上述操作后,有的同学会发现一个哲学性的问题:异常,从哪里来的?
比如,FileNotFoundError,是在打开文件时,如果找不到,就会出现的异常。
那么我们去看一下open方法的源代码:
谜底揭晓:是方法在定义的时候,将可能出现的异常,抛出了。
所以我们才能在用这个函数时,捕获他抛出的异常。
那么接下来学习,如何抛出异常。
关键字:raise
def test1(n): #定义函数test1
n=int(n)
if n==0:
raise ValueError('invalid value %s'%n) #抛出一个valueerror异常
return 10/n
def test2():
try:
test1(0) #执行test1函数
except Exception as e : #捕获异常
print(e) #打印记录
raise #将异常抛出,可以定义其他函数处理异常,此处不做处理