在Python的try块中使用final的实际示例是什么[重复]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

[何时在finally块中使用try..except有意义? try..except之后是否只是列出语句呢?

这两者之间有什么区别?

try:
    result = 100 / 0
except ZeroDivisionError:
    print("division by zero!")
else:
    print("result is", result)
finally:
    print("final statement")

vs。

try:
    result = 100 / 0
except ZeroDivisionError:
    print("division by zero!")
else:
    print("result is", result)
print("final statement")
python try-finally
1个回答
2
投票

不是在try ..之后立即列出语句吗,除了做同样的事情?

不,不是。您假设您已涵盖了该块可以退出的所有方式。

finally确保被执行即使退出该块。其中包括returncontinuebreak,不仅是例外。

对于您的特定示例,您覆盖了[[几乎] try块中的所有可能路径。但是您没有涵盖KeyboardInterruptMemoryError。如果有人在执行过程中按下CTRL-C,则仅在第一个示例中才会执行print("some code at last")行。

那是因为您的代码没有捕获KeyboardInterruptMemoryError,但是这些异常仍然可能发生。如果为result = 100 / 0语句引发了异常之一,则不会捕获该异常,并且

将退出整个帧

。但不是在执行finally:子句之前。更容易用另一个示例来演示,该示例未捕获所引发的异常:

mapping = {42: "The answer"} try: result = mapping[42] / 17 except KeyError: print("Oops, no key 42 defined!") else: print(result) finally: del mapping

这里,finally语句

将被执行,即使上面的代码引发了TypeError例外:>>> mapping = {42: "The answer"} >>> try: ... result = mapping[42] / 17 ... except KeyError: ... print("Oops, no key 42 defined!") ... else: ... print(result) ... finally: ... del mapping ... Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: unsupported operand type(s) for /: 'str' and 'int' >>> mapping # was deleted in the `finally` block Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'mapping' is not defined
这就是finally通常用于的目的,

以清理资源

。您甚至可以在return退出函数的情况下使用它:>>> def foo(): ... try: ... return 42 ... finally: ... print("Returning doesn't stop finally from executing!") ... print("This is never reached") ... >>> foo() Returning doesn't stop finally from executing! 42
请注意,Python还具有with statementwith来帮助完成相同的工作。上下文管理器

encapsulate

通常在context managers中进行清理,使您避免不得不在较长的代码末尾查找finally块,只是检查例如文件是否已关闭。所以代替:

finally

您可以将文件对象用作上下文管理器,并且上面的内容简化为:

fileobj = open(filename) try: with line in fileobj: # many lines of parsing code # . # etc. # . finally: fileobj.close()

© www.soinside.com 2019 - 2024. All rights reserved.