python异常处理,及异常处理的五大机制
什么是python的异常处理
python的异常处理,简而言之就是当程序发生错误时,能够通过程序对错误进行捕捉,并处理,从而不会导致程序全盘崩溃!要怎么更好地理解呢?我们可以打个比方,如下个标题的内容。
python异常处理,就好像考试答题
通常情况下,考试的卷子上从头到尾不可能只有一道题(就像python的项目不可能只有一个功能),然后,题目有容易的有难的,甚至是有错的(就像程序可能是简单的也可能是复杂的),再加上参加考试的人的知识储备不同(用户的操作习惯不同),都可能导致有些题目答错了,或不会答(程序因为种种原因发生异常),这种情况下,我们不可能就卡在那道不会答的题目那里,然后直接放弃掉后面的那些题目,绝大多数的人会跳过这道题,然后继续答下去。python的异常捕捉处理程序也是如此,就是让程序暂时跳过发生异常的地方,然后继续执行下去,而不至于全盘奔溃。
python异常处理的基本机构
try:
pass
except Exception as err:
pass
异常处理的机制
- 如上异常处理的基本机构,python的程序由上往下执行,到了try这里,先执行try里面的代码块,如果没有发生异常,则跳过except里面的代码块,继续执行其他的;
- 如果在try里面的代码块当中发生了异常,那么在异常发生的下面的代码停止执行,并执行except里面的代码块,之后再继续往下执行其他的程序;
- 异常捕捉需要匹配正确的异常类型(Exception),否则异常无法正确捕捉,这时,异常捕捉的任务会传达到上一级的try...except代码块去处理,以此类推,直到无法捕捉而抛出异常,程序继而终止;
- 多个异常捕捉排列在一起时,程序也是自上而下执行,当异常一旦被捕捉,其他的except将不会继续执行;
- Exception是通用的异常类型,可以捕捉任何一种异常,尤其方便之处,不过也尤其弊端,比如无法正确记录错误日志等。
下面是第一个实例,介绍python异常捕捉的最基本的机制。
def examination():
print('参加考试了!')
try:
print('这道题很容易,一下子就做完了!')
print('这道题很难!')
a = int('a12')
print('跟这道题杠上了!')
except ValueError as err:
print('还是先跳过这道题吧,先把容易的有把握的分先拿下!')
print('果然,下面的题很简单,考试不仅考大家的知识,还考大家的应对能力!')
examination()
————————————————————————
代码输出:
参加考试了!
这道题很容易,一下子就做完了!
这道题很难!
还是先跳过这道题吧,先把容易的有把握的分先拿下!
果然,下面的题很简单,考试不仅考大家的知识,还考大家的应对能力!
代码解析
- 如上代码,try里面的代码a = int('a12')中,int()函数转换非数值型数据会发生异常,因为使用了异常处理的结构,所以,当代码执行到这里时,异常被except ValueEroor捕捉,然后执行except里面的代码,之后再执行程序中其他的代码;
- ValueError是专门用来捕捉值异常的,如果使用了其他的异常类型将无法正确捕捉(除了Exception通用异常),比如下面的一个实例。
异常处理的顺序机制
下面这个实例,将介绍的是异常捕捉的顺序机制。还是用上面的考试实例,外加了两个except:
def examination():
print('参加考试了!')
try:
print('这道题很容易,一下子就做完了!')
print('这道题很难!')
a = int("a12")
print('跟这道题杠上了!')
except NameError as err_N:
print('这道题都还没教!怎么办?')
except ValueError as err_V:
print('还是先跳过这道题吧,先把容易的有把握的分先拿下!')
except SyntaxError as err_S:
print('这道题是不是印刷有错误?')
print('果然,下面的题很简单,考试不仅考大家的知识,还考大家的应对能力!')
examination()
————————————————————————————
代码输出:
参加考试了!
这道题很容易,一下子就做完了!
这道题很难!
还是先跳过这道题吧,先把容易的有把握的分先拿下!
果然,下面的题很简单,考试不仅考大家的知识,还考大家的应对能力!
代码解析
如上代码,异常发生之后,python会自上而下地寻找except异常处理程序,先是找到NameError类型,发现错误类型并不匹配,就继续找ValueError,匹配成功后,就不会继续再去寻找下面的SyntaxError,而是直接跳过。
异常处理的传递机制——异常处理嵌套
如果在当前的try...except...异常处理的代码块当中,异常无法正确被捕捉,那么异常就会向外传递给外层的try...except...处理,以此类推,直至异常最终也无法被捕捉处理的时候,程序就抛出异常,并终止。如下实例代码:
def examination():
print('参加考试了!')
try:
print('这道题很容易,一下子就做完了!')
print('这道题很难!')
a = int("a12")
print('跟这道题杠上了!')
except NameError as err_N:
print('这道题都还没教!怎么办?')
except SyntaxError as err_S:
print('这道题是不是印刷有错误?')
print('果然,下面的题很简单,考试不仅考大家的知识,还考大家的应对能力!')
def struggle():
try:
examination()
except ValueError as err_V:
print('还是先跳过这道题吧,先把容易的有把握的分先拿下!')
struggle()
————————————————————————————————
代码输出:
参加考试了!
这道题很容易,一下子就做完了!
这道题很难!
还是先跳过这道题吧,先把容易的有把握的分先拿下!
代码解析
如上代码,我们用函数的形式,写了个嵌套的异常处理,在examination()函数中,异常没有被正确捕捉,于是向外传递给调用它的函数struggle()中的异常处理,然后被正确捕捉,而且从此输出结果中并没有“ 果然,下面的题很简单,考试不仅考大家的知识,还考大家的应对能力!”这一项内容可知,当内层的examination()函数发生异常并向外传递之时,examination()函数随即就终止执行了,跟上面提到的异常捕捉的最基本的机制(机制的前两点)是一致的。
异常通用类型Exception
Exception是异常的通用类型,可以用于捕捉任何异常,大家可以将上面第二个实例中添加一个except Exception as err_E:的结构,并且添加在ValueError类型的异常处理之前,试一试ValueError是否还会被执行,没出错的话,是不会执行的了,因为异常先被Exception捕捉并处理了。
python异常处理的五大机制,就先介绍到这里,下一章节,我们将继续介绍python抛出异常的另一种结构体。