Python学习之异常中的finally使用详解

  • Post category:Python

Python学习之异常中的finally使用详解

什么是异常?

在程序运行过程中,如果出现了错误或异常,比如程序崩溃、文件不存在、用户输入不合法等等,这时候就需要处理这些异常。在 Python 中,可以使用 try...except 语句来处理异常。try 代码块包含了可能会出现异常的代码,except 代码块可以处理在 try 代码块中出现的异常。

finally 的作用

try...except 语句中,可能会出现即使异常不被捕获,某些代码也需要被执行的情况。这个时候就需要使用 finally 语句。finally 语句中的代码无论是否发生异常都会被执行。可以将一些必要的清理代码放在这里面,比如关闭文件句柄,释放锁定等等。

finally 的语法格式

try:
    # 代码块可能导致异常
except ValueError:
    # 处理 ValueError 异常
finally:
    # 无论是否发生异常,这个代码块都会被执行

finally 的示例

示例一

以下是一个简单的示例,其中 try 代码块中出现了异常,但由于在 finally 中指定了清理代码,所以无论异常是否被捕获,finially 中的代码都会被执行。

try:
    # 以下代码会抛出异常
    print(1 / 0)
except ZeroDivisionError:
    print("出现了除以零的异常")
finally:
    print("清理代码")

输出结果:

出现了除以零的异常
清理代码

示例二

以下示例中,我们定义了一个函数 divide 用于计算两个数的商,并将结果返回给调用者。如果我们给函数传递了 0 作为除数,那么函数将会抛出异常 ZeroDivisionError。如果没有发生异常,那么我们会输出成功的提示消息。无论是否发生了异常,我们都需要通过 finally 释放锁定资源。

import threading

lock = threading.Lock()

def divide(x, y):
    # 在加锁的情况下,保证多线程运行的时候不会冲突
    lock.acquire()
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不能为零")
    else:
        print("计算结果为:", result)
    finally:
        # 保证无论是否出现异常,都会释放锁定资源
        lock.release()
        print("锁定资源已经释放")

divide(5, 0)

输出结果:

除数不能为零
锁定资源已经释放

在上面的例子中,由于除数为 0,导致函数抛出了异常。但是无论是否发生了异常,我们都会在 finally 中释放锁定资源,保证程序在任何情况下都能够正常运行。