【问题标题】:Capture exception in for statement [duplicate]在 for 语句中捕获异常 [重复]
【发布时间】:2014-01-25 11:51:28
【问题描述】:

我想在迭代器的循环之外捕获一个 intetartor 在其迭代之一中抛出的异常。

这是一个非常简化的代码版本:

class C(object):
    def _iter(self):
        for x in range(100):
            yield x, x + 3

    def doit(self):
        for a, b in self._iter():    # <-- how can I capture an excepcion here?
            print(a, b)

我可以在迭代器循环中捕获异常,但我如何将错误传递给doit 方法进行报告?我想让异常一直传播到 doit 函数,在那里我可以收集错误并继续下一个元素。

我还需要处理所有的迭代,收集错误并处理所有没有错误的迭代,这样我就可以在最后报告所有错误。这样一来,单个错误就不会阻止对所有其他元素的处理。

【问题讨论】:

  • 为什么不对_iter()实例方法内部处理错误?
  • @F.C.捕获并处理错误后是否要继续循环for a, b in self._iter(): ?只有我一个人这样解读吗?
  • @jonrsharpe 因为在_iter 内部我无法收集所有错误,并且因为_iter 必须返回doit 可以使用的东西。
  • @Nabla 这就是问题所在,我想收集所有错误并处理所有没有错误的迭代并在最后报告错误。
  • @Nabla 谢谢你,如果你喜欢标记为重复

标签: python exception iterator


【解决方案1】:

这应该可行:

class C(object):
    def _iter(self):
      try:  
          for x in range(100):
            yield x, x + 3
      except Exception as e:
          raise e

    def doit(self):
        try:
            for a, b in self._iter():    # <-- how can I capture an excepcion here?
                print(a, b)
        except Exception as e:
            # do something with e
        # rest of the python code here

【讨论】:

  • 如果发生异常,这将结束生成器,而 OP 想要继续它。
【解决方案2】:

使用 try-catch 块。

try:
  for a, b in self._iter():
    print(a, b)

except:
  #throw your exception text here

【讨论】:

  • 这不是 OP 要求的:where I can just collect the errors and continue with the next element.
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2012-02-01
  • 2010-10-17
  • 2012-07-13
相关资源
最近更新 更多