【发布时间】:2023-05-18 12:17:01
【问题描述】:
当我在上下文管理器中引发任何异常时,清理代码不会运行。例如:
from contextlib import contextmanager
try:
raise BaseException()
except BaseException:
print "bye from except"
@contextmanager
def say_goodbye():
yield
print "bye from context manager"
with say_goodbye():
raise BaseException()
将输出:
bye from except
Traceback (most recent call last):
File "", line 15, in
BaseException
请注意,try/except 正确地捕获了异常,而 with 语句没有。 关于 with 语句应该如何工作,我有什么不明白的地方吗?
你可以在这里看到代码:http://pythonfiddle.com/context-manager-failing
仅供参考,我在 OSX mavericks 上运行 python 2.7。虽然我已经能够在许多环境中复制,但我怀疑这与它有多大关系。
【问题讨论】:
-
这在
contextmanager文档中有完整的解释。最后一段完整地描述了它是如何工作的,告诉你如何使用try/except`或try/finally等。
标签: python python-2.7 exception-handling contextmanager try-except