2013-04-12 6 views
1

Я пытаюсь поймать исключения, поднятые в зеленых. Согласно 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() 

ответ

0

Greenlets будет удерживать результаты функции, порожденной для зеленой или исключения, если человек был поднят. Вы можете получить результат или переподнять исключение с помощью метода get. Поскольку вы, похоже, меняете статус, основанный на какой-либо из газели, ошибка, вызванная тем, что метод синхронизации будет выглядеть примерно так:

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()