【发布时间】:2020-09-23 04:14:54
【问题描述】:
def store(self) -> list:
result = []
for url in self.urls():
if url.should_store():
stored_url = self.func_that_can_throw_errors(url)
if stored_url: result.append(stored_url)
return result
前言:不是实际的方法名称。选择愚蠢的名字来强调
在循环过程中可能会发生错误。在这种情况下,我希望store() 返回中间结果,并且仍然引发原始异常以便在不同的地方进行处理。
做类似的事情
try:
<accumulating results ... might break>
except Exception:
return result
raise
很遗憾没有做到这一点,因为通常不会达到 raise stmt(因此返回一个空列表)。
你们有关于如何不丢失中间结果的建议吗?
非常感谢 - 干杯!
【问题讨论】:
-
据我所知,这是不可能的,你不能既抛出异常又返回一个值,控制流明智你必须做一个或另一个。您可能会做一些事情,比如返回一个标记的联合 - 一种情况是异常值,另一种是实际值(可能是“迄今为止的结果”和异常的第三种情况)。或者创建一个自定义异常,其中还包含“迄今为止的结果”。
-
在 Python 中,您可能会返回一个包含异常和“迄今为止的结果”的元组,而不是标记的联合。尽管该函数的任何调用者都应该注意检查返回值的形式是否是什么。我不知道 Python reg 中的惯用语是什么。那个。
-
Python 中最好的方法可能是总是返回一个元组,让第一部分总是(中间/完整)结果(如果有),第二部分总是抛出异常(如果有)。这确实要求函数的调用者始终必须小心检查各种可能性 reg。函数的返回值,比如只有一个结果,只有一个异常,既是结果又是异常。
-
啊,让我想起了 Go,它似乎很常见,结果是 err = func() 语句。在这种特殊情况下对我来说不利的是,我需要调整 store() 的每次调用,并且由于我希望无论如何都会抛出原始异常,因此调用语句必须以某种方式确保任何给定的异常是在处理(中间)结果后实际提出。嗯,很高兴有这样的对话。我觉得还有其他问题出现...谢谢! :))
-
是的...要使用中间结果,我必须用 try-except 包围每个 .store() 语句,以便处理其中的结果。
标签: python list exception accumulator