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
中释放锁定资源,保证程序在任何情况下都能够正常运行。