【发布时间】:2020-03-30 08:05:29
【问题描述】:
我可以在__exit__ 方法中引发异常吗?如果是这样,这个异常会传播到with 块之外吗?
例子:
class X:
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
raise MyException()
with X() as x:
pass
// What happens here? Is `MyException` propagated up the stack?
【问题讨论】:
-
你试过了吗?
-
@user2357112supportsMonica 我这里目前没有python环境。即使我尝试过,我也不知道它是否只是偶然起作用,而是被定义为未定义的行为。我想知道我是否可以在所有情况和所有环境中安全地执行此操作。
-
您可以在线试用。有很多在线 Python 环境可以在其中进行测试。例如,ideone.com、repl.it/languages/python3 或 python.org/shell。
-
“在执行此方法期间发生的异常将替换
with语句主体中发生的任何异常。” docs.python.org/3/library/stdtypes.html#contextmanager.__exit__ -
我理解想知道某件事是否是已定义的行为(当人们认为一个似乎有效的测试意味着某件事可以做时,我经常感到沮丧)。另一方面,尝试它可以快速回答很多“我可以这样做”的问题,而答案是“不,如果你尝试会出现明显的错误”。这并不碰巧是其中一种情况,但这并不会降低尝试的效用。
标签: python with-statement