• 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 块中的代码。

  • 相关阅读:
    uniapp:如何实现点击图片可以全屏展示预览
    java-net-php-python-net本科生毕业设计选导师系统演示录像2019计算机毕业设计程序
    Centos中如何删除带有特殊符号的乱码文件_rz命令产生的乱码文件如何删除_使用文件号删除乱码文件---Linux运维工作笔记058
    【C++项目】手动实现一个定长内存池(了解内存分配机制、定长内存提高效率 附源码)
    MySql---事务,索引,视图概述
    FPGA基础 - 1
    Java覆盖与重载
    c++文件读写
    【MyBatis篇】搭建MyBatis
    企业风险管理策略终极指南
  • 原文地址:https://blog.csdn.net/m0_62064241/article/details/126207112