2014-10-17 79 views
0

當在回調中執行異步urlfetch調用並且在一個tasklet內部時,似乎從回調中引發的異常不會傳播到包裝tasklet。從urlfetch回調中引發的異常

示例代碼:

def cb() : 
    raise Exception, 'just a test' 

rpc = urlfetch.create_rpc(callback = cb) 

@ndb.tasklet 
def t() : 
    try : 
    response = yield urlfetch.make_fetch_call(rpc, 'http://...') 
    except : 
    print 'an error occured' 

    raise ndb.Return 

t().get_result() 

在上面的代碼中,由開發服務器執行時,「只是一個測試」異常不會卡在微進程內;即。而不是輸出到控制檯的錯誤消息,我得到了「只是一個測試」異常報告。

如果存在與make_fetch_call相關的通用urlfetch異常(例如在出現錯誤URL時爲DownloadError),則會正確處理它。

在這種情況下,有沒有辦法在tasklet中捕獲回調生成的異常?或者,也許應該將此行爲視爲錯誤?

謝謝。

+0

如果在你的URL空間20%的 更換它會幫助你解決你的問題 – 2014-10-17 10:55:12

回答

2

我創建了一個sample project來說明正確的方法。

在閱讀代碼時,您會發現閱讀評論的好處以及與taskletsrpc.make_fetch_call()上的文檔的交叉引用。

其中一些令人困惑的方面是,ndb tasklets實際上使用異常來指示返回值(即使成功,您應該raise ndb.Return (True),使異常處理很難to around,,),以及回調函數中的異常當我們調用wait()rpc將來的對象返回t()時需要被捕獲,而url提取中的異常需要在t()內部捕獲,當我們做yield rpc.make_fetch_call()時。可能有一種方法可以使用rpc.check_success()來完成後者,但這將取決於你的黑客行爲。

我希望你能找到的來源十分有幫助,我希望你學到了關於使用異常,表明發電機做避免了教訓......