捕捉在greenlets中引发的异常

2024-06-16 09:32:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是想抓住例外情况。根据this tutorial的说法,不幸的是“在绿叶中引发的异常,留在绿叶中”。在下面的代码中,我有一个sync方法,它产生爬行greenlets。这些爬网greenlet引发了HTTPError异常,我需要在sync方法的主体中捕捉到这个异常。基于异常,我将在sync方法中设置Account对象的适当状态。你知道我如何在sync方法中捕捉greenlets中产生的异常来实现这一点吗?提前谢谢你!在

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

Tags: 方法inselfmessagesavestatusexceptiongevent
1条回答
网友
1楼 · 发布于 2024-06-16 09:32:52

Greenlets将保存为greenlet或异常生成的函数的结果(如果引发了一个)。您可以使用^{}方法获得结果或重新引发异常。 由于您似乎要根据任何greenlets错误来更改状态,因此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()

相关问题 更多 >