当前位置: 首页 > 面试题库 >

处理在生成器中引发的异常

吴刚毅
2023-03-14
问题内容

我有一个生成器和一个使用它的函数:

def read():
    while something():
        yield something_else()

def process():
    for item in read():
        do stuff

如果生成器引发异常,我想在使用者函数中处理该异常,然后继续使用迭代器,直到耗尽为止。请注意,我不想在生成器中有任何异常处理代码。

我想到了类似的东西:

reader = read()
while True:
    try:
        item = next(reader)
    except StopIteration:
        break
    except Exception as e:
        log error
        continue
    do_stuff(item)

但这对我来说看起来很尴尬。


问题答案:

这也是我不确定是否正确/优雅处理的事情。

我要做的是从生成器中获取yield一个Exception,然后将其提升到其他位置。喜欢:

class myException(Exception):
    def __init__(self, ...)
    ...

def g():
    ...
    if everything_is_ok:
        yield result
    else:
        yield myException(...)

my_gen = g()
while True:
    try:
        n = next(my_gen)
        if isinstance(n, myException):
            raise n
    except StopIteration:
        break
    except myException as e:
        # Deal with exception, log, print, continue, break etc
    else:
        # Consume n

这样,我仍然继承了Exception而没有引发它,这将导致生成器功能停止。主要缺点是我需要isinstance在每次迭代时检查产生的结果。我不喜欢可以产生不同类型结果的生成器,但是将其用作最后的选择。



 类似资料:
  • 问题内容: 这是处理生成器中引发的异常的后续操作,并讨论了一个更一般的问题。 我有一个功能,可以读取不同格式的数据。所有格式都是面向行或记录的,每种格式都有一个专用的解析功能,可以作为生成器来实现。因此,主读取函数获得一个输入和一个生成器,该生成器从输入中读取其各自的格式并将记录传递回主函数: 哪里是这样的: 我面临的问题是,尽管可能引发异常(例如,从流中读取时),但它不知道如何处理它。负责处理异

  • 我有一个REST控制器,它调用带有注释的网关(errorChannel=ERROR\u CHANNEL) 这样,无论下游发生什么错误,网关发起的集成流都将流入一个错误通道,该通道将由另一个集成流处理,这是按预期工作的。 现在,还有另一个场景,其中一个集成流从Kafka读取消息,将这些消息路由到另一个通道,另一个集成流处理这些消息,另一个流向远程服务发送HTTP请求。 如何处理上述流中可能出现的异常

  • 为什么全局异常处理不能处理筛选器中引发的异常? 我的代码现在是这样的:

  • 但这无济于事,仍然令人崩溃。 我在考虑make try{}catch返回500,并在每个过滤器中进行某种日志记录,但这将导致大量的重复。 有什么办法可以在全球范围内处理吗? MVC服务的添加方式如下:

  • 我在我的Android应用程序中使用了一个自定义的和改型客户端,它在某些特定情况下会引发异常。我正试着用Kotlin Coroutines来让它工作。

  • 让我们考虑一个<代码>父< /代码>类,它只包含一个<代码>整数< /代码>属性。我用一个空变量创建了6个父类对象。然后我将这些对象添加到列表中。 我想通过属性的值检索相应的对象。我使用了Java8流。 但是我得到了,所以我编辑了代码: 但是如果任何对象为null,我想抛出一个异常。如果列表中没有对象为null,那么我想从列表中检索相应的对象。 如何使用Java 8 Streams使用一条语句实现