在用户代码中提出的异常中,发电机中的子句除了子句以外的触发器

发布于 2025-01-24 18:48:00 字数 1369 浏览 4 评论 0原文

我有一系列嵌套的发电机,我想从第一个生成器中知道,如果用户代码中的异常为示例,请考虑以下代码:

#############################################################################
def generator():
    try:
        for i in (1, 2, 3, 4, 5, 6):
            print(f"Generator: {i}.")
            yield i
    except:
        print("Exception handled in generator")
        raise

#############################################################################
def intermediary_generator():
    try:
        gen = generator()
        while i := gen.send(None):
            print(f"Intermediary generator: {i}.")
            yield i
    except StopIteration:
        pass
    except:
        print ("Exception handled in intermediary generator")
        raise

############################################################################
user_code_generator = intermediary_generator()
try:
    while i := user_code_generator.send(None):
        print(f"User code generator: {i}.")
        if i == 4:
            raise Exception("The exception in the user code")
except StopIteration:
    pass
except:
    print("Exception handled in user code generator")
    raise

我需要用户代码中的例外来传播对于中介机构和主发电机,我期望按照打印语句进行以下序列:

Exception handled in generator
Exception handled in intermediary generator
Exception handled in user code generator

但是,如果我执行上面的代码,则不会看到在发电机或中间发电机中处理的异常。

I have a series of nested generators, and I would like to know from the first generator if an exception ocurred in the user code, for the sake of an example, consider the code below:

#############################################################################
def generator():
    try:
        for i in (1, 2, 3, 4, 5, 6):
            print(f"Generator: {i}.")
            yield i
    except:
        print("Exception handled in generator")
        raise

#############################################################################
def intermediary_generator():
    try:
        gen = generator()
        while i := gen.send(None):
            print(f"Intermediary generator: {i}.")
            yield i
    except StopIteration:
        pass
    except:
        print ("Exception handled in intermediary generator")
        raise

############################################################################
user_code_generator = intermediary_generator()
try:
    while i := user_code_generator.send(None):
        print(f"User code generator: {i}.")
        if i == 4:
            raise Exception("The exception in the user code")
except StopIteration:
    pass
except:
    print("Exception handled in user code generator")
    raise

I need the exception in the user code to propagate down to the intermediary and main generator, I was expecting the following sequence as per the print statements:

Exception handled in generator
Exception handled in intermediary generator
Exception handled in user code generator

But if I execute the code above I do not see the exception handled in the generator or intermediary generator.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长安忆 2025-01-31 18:48:00

我想我会回答自己的问题,生成器的投掷方法正是我需要的,这将用户代码中的异常传播到主发电机。

#############################################################################
def generator():
    try:
        for i in (1, 2, 3, 4, 5, 6):
            print(f"Generator: {i}.")
            yield i
    except:
        print("Exception handled in generator")
        raise

#############################################################################
def intermediary_generator():
    try:
        gen = generator()
        while i := gen.send(None):
            print(f"Intermediary generator: {i}.")
            yield i
    except StopIteration:
        print("Stop iteration in intermediary generator")
    except Exception as exc:
        print ("Exception handled in intermediary generator")
        gen.throw(exc)
        raise

############################################################################
user_code_generator = intermediary_generator()
try:
    while i := user_code_generator.send(None):
        print(f"User code generator: {i}.")
        if i == 4:
            raise Exception("The exception in the user code")
except StopIteration:
    pass
except Exception as exc:
    print("Exception handled in user code generator")
    user_code_generator.throw(exc)
    raise

和输出:

Generator: 1.
Intermediary generator: 1.
User code generator: 1.
Generator: 2.
Intermediary generator: 2.
User code generator: 2.
Generator: 3.
Intermediary generator: 3.
User code generator: 3.
Generator: 4.
Intermediary generator: 4.
User code generator: 4.
Exception handled in user code generator
Exception handled in intermediary generator
Exception handled in generator
Traceback (most recent call last):
  File "<string>", line 39, in <module>
  File "<string>", line 25, in intermediary_generator
  File "<string>", line 9, in generator
  File "<string>", line 20, in intermediary_generator
  File "<string>", line 34, in <module>
Exception: The exception in the user code

I think I will answer my own question, the throw method of a generator does exactly what I need, which is propagating the exception in the user code down to the main generator.

#############################################################################
def generator():
    try:
        for i in (1, 2, 3, 4, 5, 6):
            print(f"Generator: {i}.")
            yield i
    except:
        print("Exception handled in generator")
        raise

#############################################################################
def intermediary_generator():
    try:
        gen = generator()
        while i := gen.send(None):
            print(f"Intermediary generator: {i}.")
            yield i
    except StopIteration:
        print("Stop iteration in intermediary generator")
    except Exception as exc:
        print ("Exception handled in intermediary generator")
        gen.throw(exc)
        raise

############################################################################
user_code_generator = intermediary_generator()
try:
    while i := user_code_generator.send(None):
        print(f"User code generator: {i}.")
        if i == 4:
            raise Exception("The exception in the user code")
except StopIteration:
    pass
except Exception as exc:
    print("Exception handled in user code generator")
    user_code_generator.throw(exc)
    raise

And the output:

Generator: 1.
Intermediary generator: 1.
User code generator: 1.
Generator: 2.
Intermediary generator: 2.
User code generator: 2.
Generator: 3.
Intermediary generator: 3.
User code generator: 3.
Generator: 4.
Intermediary generator: 4.
User code generator: 4.
Exception handled in user code generator
Exception handled in intermediary generator
Exception handled in generator
Traceback (most recent call last):
  File "<string>", line 39, in <module>
  File "<string>", line 25, in intermediary_generator
  File "<string>", line 9, in generator
  File "<string>", line 20, in intermediary_generator
  File "<string>", line 34, in <module>
Exception: The exception in the user code
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文