我想知道为什么我们在使用@contextmanager装饰器时需要使用try-finally。
给出的示例提示:
from contextlib import contextmanager
@contextmanager
def managed_resource(*args, **kwds):
resource = acquire_resource(*args, **kwds)
try:
yield resource
finally:
release_resource(resource)
然而,在我看来,这将做完全相同的事情:
@contextmanager
def managed_resource(*args, **kwds):
resource = acquire_resource(*args, **kwds)
yield resource
release_resource(resource)
我肯定我一定错过了什么。我错过了什么?
因为在代码终止之前,无论发生什么情况(停电除外),finally
语句都可以保证运行。这样写可以保证资源总是被释放
finally
确保其下的代码始终执行,即使有异常引发:
from contextlib import contextmanager
@contextmanager
def exception_handler():
try:
yield
finally:
print("cleaning up")
with exception_handler():
result = 10 / 0
如果没有try-finally,上面的例子之后就不会自己清理了。