首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >try-except finally中的神秘行为

try-except finally中的神秘行为
EN

Stack Overflow用户
提问于 2012-02-08 13:11:44
回答 3查看 135关注 0票数 0

请原谅这个模糊的标题,我不知道还能怎么说。

我有一个任务工作者请求处理程序,它从URL获取数据并将其写入blobstore,然后将数据的blob_key保存到数据存储中的ListProperty。为了清晰起见,我在这里尝试简化代码:

代码语言:javascript
复制
class Fetch(webapp2.RequestHandler):
    def get(self):

        url = self.request.get('url')
        itemKey = self.request.get('itemKey')
        item = MyModel.get(itemKey)

        try:
            result = urlfetch.fetch(url=url)
            if result.status_code == 200:
                saveDataResult = save_data(result.content, itemKey)
                if saveDataResult is False:
                    raise Exception('error saving data')
            else:
                raise Exception('error fetching data: %s' % result.status_code)

            item.status = 'success'
        except Exception:
            item.status = 'failed'
        finally:
            item.put()

def save_data(data, itemKey)
    try:
        #write data to blobstore and get its blob_key...
        blob_key = files.blobstore.get_blob_key(file_name)
        item = MyModel.get(itemKey)
        item.blobKey.append(blob_key)
        item.put()

        return True
    except:
        return False

现在我遇到的问题是,当saveDataResult返回True时,它的状态被设置为'success‘,但是它的blobKey属性不包含任何值,即使生成了一个blob_key并且成功地写入了数据。我不明白是什么原因救了我的命,请帮帮忙。

EN

回答 3

Stack Overflow用户

发布于 2012-02-08 13:34:03

在没有更多信息的情况下,很难确定发生了什么。这是我有根据的猜测:

get()save_data()中都调用MyModel.get(itemKey)。我猜想它会返回两个不同的对象来表示项目。在save_data中更新blobKey时,更新仅发生在save_data中获取的对象中。当您稍后在该范围之外检查它时,您看到的是一个不同的对象。

这是否正确将取决于MyModel.get()的实现。

另外,您应该知道您调用了item.put()两次,对吧?

票数 2
EN

Stack Overflow用户

发布于 2012-02-08 16:15:29

问题就在这里

代码语言:javascript
复制
finally:
    item.put()

这一次调用覆盖了save_data()保存的数据,因为它引用了一个较旧的item对象。

我的建议是,你可以从save_data()进行状态更新,比如item.status = 'success',或者将item = MyModel.get(itemKey)移到save_data()之后,这样你就可以获取更新后的对象了。

票数 1
EN

Stack Overflow用户

发布于 2012-02-08 15:41:07

问题是,当您使用item = MyModel.get(itemKey)调用save_data()时,您最终拥有两个不同的对象,因此覆盖了save_data()中的一个对象,因此当您转到模型数据存储时,blobkey的数据不会存储为被覆盖的数据。

尝试在类中执行所有操作,否则不要两次使用item = MyModel.get(itemKey)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9188139

复制
相关文章

相似问题

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