本文共 1389 字,大约阅读时间需要 4 分钟。
Try语句中也可以其他可选择语句,这些语句被用来定义清除动作。这些动作无论在任何情况下都会执行。如下:
>>> try:
... raise KeyboardInterrupt
... finally:
... print(’Goodbye, world!’)
...
Goodbye, world!
KeyboardInterrupt
不管异常是否发生,Finally语句常常在离开try语句之前执行。当在try语句中异常发生并且还没来的except处理(或者它在except或else语句中发生),在finally语句执行之后也可以在此抛出异常。即使通过break,continue,或者return等其他任何子句,当要离开关键字try语句时finally也会被执行。一个稍微复杂的例子“
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: ’str’ and ’str’
如你所见,无论任何情况finally语句都会执行。 两个字符串相除抛出的异常没有被except语句所处理,因此在finally语句后重新抛出。
在真实的应用中,finally语句对释放外部资源(文件或者网络连接)有很重要的意义,不管这些资源是否正确使用。
一些对象定义了标准的清理行为,当这些对象不再使用时候,不管是否正确运用这个对象,这些行为都会执行。看看下面的例子,该例子用来打开一个文件把内容打印在屏幕上。
for line in open("myfile.txt"):
print(line)
这行代码的问题在于当执行完这段代码后,它让文件在一段不确定的时间里处于打开的状态。在简单的脚本中这不是个问题,但是在较大的应用中这是个重大的问题。
With语句让对象比如文件能以一种更加适当的方法被应用。它确保这些对象能正确和实时的清除。
with open("myfile.txt") as f:
for line in f:
print(line)
在这段语句执行之后,文件f就会关闭,即使在处理行时产生问题。像文件这些对象,涉及到的提前清除行为在它们各自的文档中有描述。
转载地址:http://hskai.baihongyu.com/