Python - try-finally 块



Python try-finally 块

在 Python 中,try-finally 块用于确保某些代码一定会执行,无论是否引发异常。与处理异常的 try-except 块不同,try-finally 块专注于必须执行的清理操作,确保资源得到正确释放并完成关键任务。

语法

try-finally 语句的语法如下:

try:
   # Code that might raise exceptions
   risky_code()
finally:
   # Code that always runs, regardless of exceptions
   cleanup_code()
在 Python 中,使用 try 块进行异常处理时,可以选择包含 except 子句来捕获特定异常,或者包含 finally 子句来确保执行某些清理操作,但不能同时包含两者。

示例

让我们考虑一个示例,我们希望以写入模式 ("w") 打开一个文件,向其中写入一些内容,并使用 finally 块确保无论成功或失败都关闭文件:

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print ("Error: can\'t find file or read data")
   fh.close()

如果您没有权限以写入模式打开文件,则会产生以下输出

Error: can't find file or read data

相同的示例可以更简洁地编写如下:

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print ("Going to close the file")
      fh.close()
except IOError:
   print ("Error: can\'t find file or read data")

当 try 块中抛出异常时,执行立即传递到finally 块。在执行finally 块中的所有语句后,异常将再次引发,如果在 try-except 语句的上一层存在 except 语句,则会在那里进行处理。

带参数的异常

异常可以带有一个参数,该参数是一个值,提供有关问题的更多信息。参数的内容因异常而异。您可以通过在 except 子句中提供一个变量来捕获异常的参数,如下所示:

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

如果您编写代码来处理单个异常,则可以在 except 语句中在异常名称之后添加一个变量。如果您正在捕获多个异常,则可以在异常元组之后添加一个变量。

此变量接收异常的值,主要包含异常的原因。变量可以接收单个值或多个值(以元组的形式)。此元组通常包含错误字符串、错误号和错误位置。

示例

以下是一个针对单个异常的示例:

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as Argument:
      print("The argument does not contain numbers\n",Argument)
# Call above function here.
temp_convert("xyz")

它将产生以下输出

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
广告