在 Python 中,try-finally
块用于确保某些代码无论是否引发异常都能够执行。与处理异常的 try-except
块不同,try-finally
块专注于必须执行的清理操作,确保资源被正确释放并且关键任务得以完成。
语法
try-finally
语句的语法如下:
try:
risky_code()
finally:
cleanup_code()
在 Python 中,当使用带有 try
块的异常处理时,你可以选择包含用于捕获特定异常的 except
子句或者包含一个用于确保某些清理操作被执行的 finally
子句,但不能同时包含两者。
示例
让我们考虑一个例子,在这个例子中,我们需要以写模式 ("w") 打开一个文件,向其中写入一些内容,并且确保无论成功与否都要关闭该文件,使用 finally
块来实现这一点:
try:
fh = open("testfile", "w")
fh.write("这是我的异常处理测试文件!!")
finally:
print("错误: 无法找到文件或读取数据")
fh.close()
如果没有权限以写模式打开文件,则会产生以下输出:
错误: 无法找到文件或读取数据
同样的例子可以用更清晰的方式重写如下:
try:
fh = open("testfile", "w")
try:
fh.write("这是我的异常处理测试文件!!")
finally:
print("准备关闭文件")
fh.close()
except IOError:
print("错误: 无法找到文件或读取数据")
当 try
块中抛出异常时,执行会立即传递给 finally
块。在 finally
块中的所有语句执行完毕后,异常会被再次抛出,并在 try-except
语句的下一个更高层中处理,如果存在的话。
带参数的异常
异常可以带有一个参数,这个参数提供有关问题的额外信息。异常参数的内容因异常类型而异。你可以在 except
子句中提供一个变量来捕获异常的参数,如下所示:
try:
......................
except ExceptionType as Argument:
如果你编写的是处理单一异常的代码,可以在 except
语句中异常名称后面跟一个变量。如果你正在捕获多个异常,可以在异常元组后面跟一个变量。
这个变量接收异常的值,通常包含导致异常的原因。变量可以接收单个值或多个值形式的元组。这个元组通常包含错误字符串、错误编号以及错误位置。
示例
以下是一个单个异常的示例:
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print("参数不包含数字\n", Argument)
temp_convert("xyz")
它将产生以下输出:
参数不包含数字
invalid literal for int() with base 10: 'xyz'