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抛出异常的另一种结构体。


全栈后端 / python教程 :


























Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.