Python 捕获greenlets中提出的异常
我正试图抓住Greenlet中提出的例外情况。不幸的是,根据《绿皮书》中提出的例外情况,留在绿皮书中。在下面的代码中,我有一个生成爬网绿叶的同步方法。这些爬网greenlet引发HTTPError异常,我需要在sync方法的主体中捕获该异常。根据异常情况,我将在sync方法中设置Account对象的适当状态。知道如何在sync方法中捕获greenlet中引发的异常以实现这一点吗?提前谢谢你Python 捕获greenlets中提出的异常,python,exception,exception-handling,gevent,greenlets,Python,Exception,Exception Handling,Gevent,Greenlets,我正试图抓住Greenlet中提出的例外情况。不幸的是,根据《绿皮书》中提出的例外情况,留在绿皮书中。在下面的代码中,我有一个生成爬网绿叶的同步方法。这些爬网greenlet引发HTTPError异常,我需要在sync方法的主体中捕获该异常。根据异常情况,我将在sync方法中设置Account对象的适当状态。知道如何在sync方法中捕获greenlet中引发的异常以实现这一点吗?提前谢谢你 # this is standalone helper method def crawl(item):
# 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()
greenlet将保存为greenlet或异常生成的函数的结果(如果引发)。您可以使用该方法获得结果或重新引发异常。 由于您似乎正在根据任何一个出错的greenlet更改状态,因此sync方法的最终结果如下所示:
def sync(self):
"Sync search index with data from source"
greenlets = [gevent.spawn_link_exception(crawl, item) for item in self.get_navigation()]
gevent.joinall(greenlets)
try:
results = [greenlet.get() for greenlet in greenlets]
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()
self.date_synced = datetime.datetime.now()
self.save()