在Python中定义清理动作

当我们希望我们的程序执行此特定任务时,无论它运行完美还是抛出错误,都会发生很多情况。大多数情况下是为了捕获任何错误或异常,我们使用try和except块。

“ try”语句提供了非常有用的可选子句,该子句用于定义在任何情况下都必须执行的“清理操作”。例如-

>>> try:
   raise SyntaxError
finally:
   print("学习Python!")
学习Python!
Traceback (most recent call last):
   File "<pyshell#11>", line 2, in <module>
      raise SyntaxError
   File "<string>", line None
SyntaxError: <no detail available>

final子句无论执行什么都将执行,但是else子句仅在未引发异常的情况下执行。

Example1-考虑下面的示例,其中看起来一切正常,并且无例外地写入文件(程序正在运行),将输出以下内容:

file = open('finally.txt', 'w')
try:
   file.write("Testing1 2 3.")
   print("写入文件。")
except IOError:
   print("无法写入文件。")
else:
   print("写成功。")
finally:
   file.close()
   print("文件已关闭。")

在运行上述程序时,将获得-

写入文件。
写成功。
文件已关闭。

示例2-让我们尝试通过将文件设置为只读并尝试在其上写入以引发异常来引发异常。

file = open('finally.txt', 'r')
try:
   file.write("Testing1 2 3.")
   print("写入文件。")
except IOError:
   print("无法写入文件。")
else:
   print("写成功。")
finally:
   file.close()
   print("文件已关闭。")

上面的程序将给出输出,例如-

无法写入文件。
文件已关闭。

如果我们有一个错误,但是我们没有放置任何except子句来处理它。在这种情况下,将首先执行清理操作(最终块),然后由编译器引发错误。让我们通过以下示例了解概念-

file = open('finally.txt', 'r')
try:
   file.write(4)
   print("写入文件。")
except IOError:
   print("无法写入文件。")
else:
   print("写成功。")
finally:
   file.close()
   print("文件已关闭。")

输出结果

文件已关闭。
Traceback (most recent call last):
   File "C:/Python/Python361/finally_try_except1.py", line 4, in <module>
      file.write(4)
TypeError: write() argument must be str, not int

因此,从上面我们可以看到,无论是否发生异常,子句始终执行。