Я пытаюсь поймать исключения, поднятые в зеленых. Согласно this tutorial, к сожалению, «исключения, поднятые в Гринлете, остаются внутри Гринлета». В приведенном ниже коде у меня есть метод синхронизации, который порождает галочки обхода. Эти обходные зелья создают исключение HTTPError, которое мне нужно поймать в теле метода синхронизации. Исходя из исключения, в методе синхронизации я установил соответствующий статус объекта Account. Любая идея, как я могу поймать исключения, поднятые в зеленых в методе синхронизации, чтобы это сделать? Заранее спасибо!Ловля исключений, поднятых в зелени
# this is standalone helper method
def crawl(item):
try:
item.refresh_children(False) # THROWS HTTPError exception
greenlets = [gevent.spawn_link_exception(crawl, child) for child in item.children]
gevent.joinall(greenlets)
except HTTPError, e:
print e.message
raise e
except (JSONDecodeError, InvalidCredentialsException) as e:
print e.message
raise e
# this is instance method of the Account class
def sync(self):
"Sync search index with data from source"
try:
greenlets = [gevent.spawn_link_exception(crawl, item) for item in self.get_navigation()]
gevent.joinall(greenlets)
self.date_synced = datetime.datetime.now()
self.save()
except HTTPError, e:
if e.status_code == 401:
self.status = 'revoked'
else:
self.status = 'error'
self.save()
except LinkedFailed, e:
print e.message
exception_name = e.message.split()[-1]
if exception_name in ['HTTPError', 'JSONDecodeError']:
self.status = 'error'
self.save()
elif exception_name == 'InvalidCredentialsException':
self.status = 'revoked'
self.save()