[英]python exception handling inside with block
在下面的代码做什么错with
python3的声明和异常处理? 如果不是,编写我预期输出的正确方法是什么?
from contextlib import contextmanager
@contextmanager
def test():
print("Hello")
yield
print("goodbye")
try:
with test():
print("inside test")
raise KeyError
except KeyError:
print("KeyError")
else:
print("else")
finally:
print("finally")
而输出是
Hello
inside test
KeyError
finally
我希望输出是:
Hello
inside test
goodbye
KeyError
finally
我相信其他人写的相似,希望在处理文件期间引发异常时文件将被关闭。
我的python3版本是:
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.version)
3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609]
由with语句控制的块内的异常通过generator.throw()
传播到您的生成器上下文管理generator.throw()
,如PEP 343:“Generator Decorator”所示 ,它在生成器暂停时引发异常。 换句话说,你应该在try / except或try / finally中包装yield
:
@contextmanager
def test():
print("Hello")
try:
# The block of the with statement executes when the generator yields
yield
finally:
print("goodbye")
引用有关该主题的官方文档 :
...如果块中发生未处理的异常,则在生成器发生的点处将其重新加入。 因此,您可以使用try ... except ... finally语句来捕获错误(如果有),或确保进行一些清理。 如果仅为了记录异常或执行某些操作(而不是完全禁止它)而捕获异常,则生成器必须重新加载该异常。 否则,发电机上下文管理器将指示与语句的异常被处理,并执行将与该语句紧随恢复与声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.