• Python try except else或finally异常处理


    Python try except else异常处理

    在原本的try except结构的基础上,Python 异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else结构。
    使用 else 包裹的代码,只有当 try 块没有捕获到任何异常时,才会得到执行;反之,如果 try 块捕获到异常,即便调用对应的 except 处理完异常,else 块中的代码也不会得到执行。
    举个例子:

    try:

        result = 20 / int(input('请输入除数:'))

        print(result)

    except ValueError:

        print('必须输入整数')

    except ArithmeticError:

        print('算术错误,除数不能为 0')

    else:

        print('没有出现异常')

    print("继续执行")

    可以看到,在原有 try except 的基础上,我们为其添加了 else 块。现在执行该程序:

    请输入除数:4
    5.0
    没有出现异常
    继续执行

    如上所示,当我们输入正确的数据时,try 块中的程序正常执行,Python 解释器执行完 try 块中的程序之后,会继续执行 else 块中的程序,继而执行后续的程序。
    疑问:既然 Python 解释器按照顺序执行代码,那么 else 块有什么存在的必要呢?直接将 else 块中的代码编写在 try except 块的后面,不是一样吗?
    当然不一样,现在再次执行上面的代码:

    请输入除数:a
    必须输入整数
    继续执行

    可以看到,当我们试图进行非法输入时,程序会发生异常并被 try 捕获,Python 解释器会调用相应的 except 块处理该异常。但是异常处理完毕之后,Python 解释器并没有接着执行 else 块中的代码,而是跳过 else,去执行后续的代码。
    也就是说,else 的功能,只有当 try 块捕获到异常时才能显现出来。在这种情况下,else 块中的代码不会得到执行的机会。而如果我们直接把 else 块去掉,将其中的代码编写到 try except 的后面:

    try:

        result = 20 / int(input('请输入除数:'))

        print(result)

    except ValueError:

        print('必须输入整数')

    except ArithmeticError:

        print('算术错误,除数不能为 0')

    print('没有出现异常')

    print("继续执行")

    程序执行结果为:

    请输入除数:a
    必须输入整数
    没有出现异常
    继续执行

    可以看到,如果不使用 else 块,try 块捕获到异常并通过 except 成功处理,后续所有程序都会依次被执行。

    Python try except finally:资源回收

    Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的

    程序做扫尾清理工作。

    注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。

    在整个异常处理机制中,finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。

    基于 finally 语句的这种特性,在某些情况下,当 try 块中的程序打开了一些物理资源(文件、数据库连接等)时,由于这些资源必须手动回收,而回收工作通常就放在 finally 块中。

    Python 垃圾回收机制,只能帮我们回收变量、类对象占用的内存,而无法自动完成类似关闭文件、数据库连接等这些的工作。

    注意;首先,try 块不适合做资源回收工作,因为一旦 try 块中的某行代码发生异常,则其后续的代码将不会得到执行;其次 except 和 else 也不适合,它们都可能不会得到执行。而 finally 块中的代码,无论 try 块是否发生异常,该块中的代码都会被执行。

    举个例子:

    try:

        a = int(input("请输入 a 的值:"))

        print(20/a)

    except:

        print("发生异常!")

    else:

        print("执行 else 块中的代码")   

    finally :

        print("执行 finally 块中的代码")

    运行此程序:

    请输入 a 的值:4
    5.0
    执行 else 块中的代码
    执行 finally 块中的代码

    可以看到,当 try 块中代码为发生异常时,except 块不会执行,else 块和 finally 块中的代码会被执行。

    再次运行程序:

    请输入 a 的值:a
    发生异常!
    执行 finally 块中的代码

    可以看到,当 try 块中代码发生异常时,except 块得到执行,而 else 块中的代码将不执行,finally 块中的代码仍然会被执行。

    finally 块的强大还远不止此,即便当 try 块发生异常,且没有合适和 except 处理异常时,finally 块中的代码也会得到执行。例如:

    try:

        #发生异常

        print(20/0)

     

    finally :

        print("执行 finally 块中的代码")

    程序执行结果为:

    执行 finally 块中的代码
    Traceback (most recent call last):
      File "D:\python3.6\1.py", line 3, in
        print(20/0)
    ZeroDivisionError: division by zero

    可以看到,当 try 块中代码发生异常,导致程序崩溃时,在崩溃前 Python 解释器也会执行 finally 块中的代码。

  • 相关阅读:
    【GIT】解决合并冲突完整流程(带图及步骤)
    代理IP和Socks5代理:跨界电商与全球爬虫的关键技术
    测试面试 | 某互联网大厂测试面试真题,你能回答出多少?
    istio系列:番外一 外网到内网访问配置实例
    Java:实现FibonacciHeap数据结构算法(附完整源码)
    maven大全(概述、maven安装配置、IDEA配置maven、IDEA创建maven项目并如何使用)
    mmdetection训练得到的权重/checkpoints文件分析
    可编程 USB 转串口适配器开发板芯片驱动文件说明
    Git命令
    Spring Data JPA渐进式学习--如何自定义查询方法呢?
  • 原文地址:https://blog.csdn.net/m0_62064241/article/details/126207112