繁体   English   中英

Python 上下文管理器装饰器掩盖了我的异常?

[英]Python context-manager decorator masks my exception?

按照https://docs.python.org/3/library/contextlib.html中的示例..

在下面的合成代码中:

import sys
from contextlib import contextmanager, nullcontext


class MyException(Exception):

    def __init__(self, *args: object) -> None:
        super().__init__(*args)


@contextmanager
def annotate():
    try:
        yield None
    finally:
        return


def annotate2():
    return nullcontext()


def main():
    try:
        with annotate():
            raise MyException()

    except MyException:
        print("Good, Caught exception")
        sys.exit(0)

    print("How did I get here ???")
    sys.exit(1)


if __name__ == '__main__':
    main()

未捕获异常。 但是,如果我将其更改为


 with annotate2():
            raise MyException()

然后它按预期工作。 我的问题是,我的 contextmanager 有什么问题?

@contextmanager
def annotate():
    try:
        yield None
    finally:
        return

(使用 python 3.10.4 测试)

谢谢

波阿斯

谢谢,在https://docs.python.org/3/tutorial/errors.html#defining-clean-up-actions中找到了答案

如果 finally 子句执行 break、continue 或 return 语句,则不会重新引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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