8.6. 定义清理行为

最后更新于:2022-04-01 00:48:41

try 语句还有另一个可选的子句,目的在于定义在任何情况下都一定要执行的功能。例如: ~~~ >>> try: ... raise KeyboardInterrupt ... finally: ... print('Goodbye, world!') ... Goodbye, world! KeyboardInterrupt ~~~ 不管有没有发生异常,_finally子句_ 在程序离开 try 后都一定会被执行。当 try 语句中发生了未被except 捕获的异常(或者它发生在 except 或 else 子句中),在 finally 子句执行完后它会被重新抛出。 try 语句经由 break ,continue 或 return 语句退 出也一样会执行 finally 子句。以下是一个更复杂些的例子(在同 一个 try 语句中的 except 和 finally 子句的工作方式与 Python 2.5 一样): ~~~ >>> 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 executing finally clause >>> divide(2, 0) division by zero! executing finally clause >>> divide("2", "1") executing finally clause Traceback (most recent call last): File "", line 1, in ? File "", line 3, in divide TypeError: unsupported operand type(s) for /: 'str' and 'str' ~~~ 如你所见, finally 子句在任何情况下都会执行。TypeError 在两个字符串相除的时候抛出,未被 except 子句捕获,因此在 finally 子句执行完毕后重新抛出。 在真实场景的应用程序中,finally 子句用于释放外部资源(文件 或网络连接之类的),无论它们的使用过程中是否出错。
';