2013-07-19 94 views

回答

3

docs

如果函数抛出一个异常,事务被立即中止,NDB,以便调用代码看到它重新引发异常。通过引发ndb.Rollback异常(在这种情况下,函数调用返回None),您可以强制事务静默失败。没有强制重试的机制。

可以产生一个异常在单元测试,而不是你的put()函数来模拟这种情况下,它应该效仿相同的结果 - 因为未能把将导致所有数据存储的事件在事务回滚无论如何。

您可能会发现交易异常these kinds

您可以接收超时,TransactionFailedError,或InternalError该异常在交易一直致力于最终将成功地应用于案例。

+0

我对Timeout,TransactionFailedError和InternalError异常有点困惑。如果交易成功,我的客户端会缓存交易中保存的对象。如果发生故障,我会捕获异常并向用户返回错误,但是这些异常是否意味着它可能会或可能不会实际完成交易。我应该如何向客户报告这种情况? Timeout的文档例如说它可能会或可能没有失败。这是否意味着你基本上不能确定如何告诉用户在发生异常时发生了什么? –

+0

@RichardBender对于大多数交易,您会希望他们重试多次(我相信默认值是3)。 *确保它们是幂等的* 对于所有这些,您希望提供的错误通常是“临时站点错误”消息,因为它们都指的是一块AppEngine服务不可用。 (瞬态错误)。 至于对象的有效性,您应该总是尝试重试超时错误,因为您永远无法确定。伊莫,这将涉及只有当你确定时才显示成功(即从未超时) – Josh