2013-07-19 91 views

回答

3

docs

如果函數拋出一個異常,事務被立即中止,NDB,以便調用代碼看到它重新引發異常。通過引發ndb.Rollback異常(在這種情況下,函數調用返回None),您可以強制事務靜默失敗。沒有強制重試的機制。

可以產生一個異常在單元測試,而不是你的put()函數來模擬這種情況下,它應該效仿相同的結果 - 因爲未能把將導致所有數據存儲的事件在事務回滾無論如何。

您可能會發現交易異常these kinds

您可以接收超時,TransactionFailedError,或InternalError該異常在交易一直致力於最終將成功地應用於案例。

+0

我對Timeout,TransactionFailedError和InternalError異常有點困惑。如果交易成功,我的客戶端會緩存交易中保存的對象。如果發生故障,我會捕獲異常並向用戶返回錯誤,但是這些異常是否意味着它可能會或可能不會實際完成交易。我應該如何向客戶報告這種情況? Timeout的文檔例如說它可能會或可能沒有失敗。這是否意味着你基本上不能確定如何告訴用戶在發生異常時發生了什麼? –

+0

@RichardBender對於大多數交易,您會希望他們重試多次(我相信默認值是3)。 *確保它們是冪等的* 對於所有這些,您希望提供的錯誤通常是「臨時站點錯誤」消息,因爲它們都指的是一塊AppEngine服務不可用。 (瞬態錯誤)。 至於對象的有效性,您應該總是嘗試重試超時錯誤,因爲您永遠無法確定。伊莫,這將涉及只有當你確定時才顯示成功(即從未超時) – Josh