如果在循环期间发生异常:如何在传递异常之前返回中间结果?

时间:2020-06-04 08:33:08

标签: python list exception accumulator

store()

前言:不是实际的方法名称。选择要强调的愚蠢名字

在循环期间可能会发生错误。在那种情况下,我希望中间结果由try: <accumulating results ... might break> except Exception: return result raise 返回,并且仍然引发原始异常,以便在其他地方进行处理。

做类似的事情

dateInput

很难做到这一点,因为不会轻易达到加薪stmt(因此返回空列表get)。

你们对如何失去中间结果有建议吗?

非常感谢-干杯!

3 个答案:

答案 0 :(得分:2)

这是您无法想象的。您不能引发异常并返回值。

因此,我认为您所要求的是解决方法。在那里,我看到了两种可能性:

  1. 沿着实际返回值返回标志/异常:

返回标志:

except Exception:
    return result, False

其中False是标志,指示出了什么问题

返回异常:

except Exception as e:
    return result, e
  1. store出现以来,它是某个类的方法,您可以引发异常并通过第二次调用来检索中间结果,如下所示:
def store(self):
    result = []
    try:
        # something
    except Exception:
        self.intermediary_result = result
        raise

def retrieve_intermediary(self):
    return self.intermediary_result

答案 1 :(得分:2)

鉴于我对Python的有限了解,我能提供的最佳答案是始终返回一个对,其中对的第一部分是结果,而对第二部分是可选的异常值。

def store(self) -> list:
    '''
    TODO: Insert documentation here.

    If an error occurs during the operation, a partial list of results along with
    the exception value will be returned.

    :return A tuple of [list of results, exception]. The exception part may be None.
    '''

    result = []

    for url in self.urls():

        if url.should_store():
            try:
                stored_url = self.func_that_can_throw_errors(url)
            except Exception as e:
                return result, e

            if stored_url: result.append(stored_url)

    return result, None

如上所述,如果您在代码中的多个地方调用了此方法,则必须小心在所有相关位置进行更改,并且可能会更改处理方式。尽管我对Python的类型提示知之甚少,但是类型检查在这里可能会有所帮助。

答案 2 :(得分:1)

与此同时,我有一个想法是只使用一个累加器,该累加器似乎是目前“最快”的解决方案,在调用store()的项目中所做的更改最少。 (中间)结果并不是到处都需要的(假设它是可选的)。所以...

我想与您分享:

    def store(self, result_accu=None) -> list:
        if result_accu is None:
            result_accu = []
        for url in self.urls():
            if url.should_store():
                stored_url = self.func(url)
                if stored_url: result_accu.append(stored_url)
        return result_accu

仍然返回一个列表,但是中间结果旁边的内容可以通过累加列表上的引用来访问。 将参数设置为可选参数可以将大多数语句保留在项目中,因为不需要在任何地方使用结果。

store()是某种命令,其中大多数数据完整性工作已在内部完成。结果现在很不错。

但是,你们也使我注意到,在ordner中仍然有工作要做,以处理中间结果。谢谢! @attalos @MelvinWM

相关问题