在用户代码中提出的异常中,发电机中的子句除了子句以外的触发器
我有一系列嵌套的发电机,我想从第一个生成器中知道,如果用户代码中的异常为示例,请考虑以下代码:
#############################################################################
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想我会回答自己的问题,生成器的投掷方法正是我需要的,这将用户代码中的异常传播到主发电机。
和输出:
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.
And the output: