繁体   English   中英

用块内部进行python异常处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM