store()
前言:不是实际的方法名称。选择要强调的愚蠢名字
在循环期间可能会发生错误。在那种情况下,我希望中间结果由try:
<accumulating results ... might break>
except Exception:
return result
raise
返回,并且仍然引发原始异常,以便在其他地方进行处理。
做类似的事情
dateInput
很难做到这一点,因为不会轻易达到加薪stmt(因此返回空列表get)。
你们对如何不失去中间结果有建议吗?
非常感谢-干杯!
答案 0 :(得分:2)
这是您无法想象的。您不能引发异常并返回值。
因此,我认为您所要求的是解决方法。在那里,我看到了两种可能性:
返回标志:
except Exception:
return result, False
其中False
是标志,指示出了什么问题
返回异常:
except Exception as e:
return result, e
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