这个问题是基于 catch errors within generator and continue afterwards 的。
我希望你能够使用这个函数来改变其行为,使其与以下内容匹配:
简而言之,我想将这个转变为:
我有大约50个类似但不同的函数,它们尝试从网站中提取URL等信息。由于每个网站都不同,每个函数也不同,而且网站随着时间的推移而改变,所以这些代码很混乱,不能信任。
以下是一个简化的示例,或者查看第一个问题中的示例。
def _get_units(self):
for list1 in self.get_list1():
for list2 in self.get_list2(list1):
for unit in list2:
yield unit
我希望你能够使用这个函数来改变其行为,使其与以下内容匹配:
def _get_units(self):
for list1 in self.get_list1():
try:
for list2 in self.get_list2(list1):
try:
for unit in list2:
try:
yield unit
except Exception as e:
log_exception(e)
except Exception as e:
log_exception(e)
except Exception as e:
log_exception(e)
简而言之,我想将这个转变为:
for x in list:
do_stuff(x)
转换为:
for x in list:
try:
do_stuff(x)
except Exception as e:
log_exception(e)
我希望在我的函数中为每个for
循环添加错误处理,但我想以Pythonic的方式实现。我不想在需要修改的50个函数中到处散布try:except
块。这是否可能?如果是,最DRY的方法是什么,是否可以在一个地方处理所有的错误呢?
更新:此问题原来包含continue
语句和日志记录,但正如mgilson指出的那样,这是不必要的。
更新2:根据georgesl的答案,该函数变为以下内容:
from contextlib import contextmanager
@contextmanager
def ErrorManaged():
try:
yield
except Exception as e:
log_exception(e)
def _get_units(self):
for list1 in self.get_list1():
with ErrorManaged():
for list2 in self.get_list2(list1):
with ErrorManaged():
for unit in list2:
with ErrorManaged():
yield unit
这确实更干净。不过,仅仅使用装饰器可能会更好。有人能告诉我这是否可能吗?如果不行,我会接受georgesl的答案。
yield
不会引发异常。 - Steven Rumbalskicontinue
在异常处理中的目的是什么?也许我漏掉了什么,但它似乎是不必要的。(请注意,如果您可以删除continue
,这个问题将变得容易得多。) - mgilsontry:except
存在,因为它将存在于循环的内容无论如何。 - ToonAlfrinktry:except
整个块,我就不需要continue
了...正在编辑... - ToonAlfrinkget_list1
和get_list2
中? - Steven Rumbalski