python - 我可以在 `__exit__` 中引发异常吗?
问题描述
我可以在__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?
解决方案
执行此方法期间发生的异常将替换 with 语句主体中发生的任何异常。
https://docs.python.org/3/library/stdtypes.html#contextmanager。出口
我们可以看到with-statement了解更多细节。无论SUITE是否抛出异常,所引发的异常__exit__
总是被抛出给调用者。
with EXPRESSION as TARGET:
SUITE
在语义上等价于:
manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False
try:
TARGET = value
SUITE
except:
hit_except = True
if not exit(manager, *sys.exc_info()):
raise
finally:
if not hit_except:
exit(manager, None, None, None)
推荐阅读
- c# - 将文件从另一个 webapi 传递到另一个 asp.net core webapi
- angular - 无法在Angular 8中的json中显示html顶部对象
- splunk - 无法读取 SPLUNK 中的嵌套 json 数组
- vue.js - 如何从组件 vue 更改主 vuetify 应用程序中的值
- git - 在 GitHub 远程存储库中推送后删除的文件
- pointers - 将 *os.File 作为 *io.Reader 传递
- c++ - 发现我的代码有什么问题,解决一个简单的竞争问题
- android - 无法将 Fragment 投射到 YouTubePlayerFragment
- node.js - 启动和停止简单 Node.js 脚本的正确方法是什么
- security - SHA 有何独特之处?