首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获在greenlet中引发的异常

捕获在greenlet中引发的异常
EN

Stack Overflow用户
提问于 2013-04-12 09:14:39
回答 1查看 5.2K关注 0票数 4

我正在尝试捕获在greenlet中引发的异常。根据this tutorial的说法,不幸的是‘Greenlet中引发的异常,留在Greenlet内部’。在下面的代码中,我使用了一个sync方法来生成爬虫greenlet。这些爬行的greenlet会引发HTTPError异常,我需要在sync方法的主体中捕获它。基于异常,在sync方法中,我将设置Account对象的适当状态。您知道如何在sync方法中捕获在greenlet中引发的异常以实现此目的吗?提前谢谢你!

代码语言:javascript
复制
# 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()
EN

回答 1

Stack Overflow用户

发布于 2013-04-21 23:40:01

greenlet将保存为greenlet或异常产生的函数的结果(如果引发了一个异常)。您可以使用get方法获取结果或重新引发异常。由于您似乎要基于任何greenlet更改状态,因此出错的sync方法最终将如下所示:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15961518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档