2013-12-21 32 views
3

我開始用扭曲作爲我將使用的庫之一取決於它。在早期的測試中,我感到困惑如何捕捉一個函數拋出這樣的異常:如何從扭曲的inlineCallbacks裝飾函數中捕捉異常?

@defer.inlineCallbacks 
def read_input_status(self, address, length, callback): 
    assert callback 
    # ... 

如果callbackNoneAssertionError被拋出,所以我想看看它...該功能被稱爲像這樣的:

def cb(): 
    pass 
def eb(): 
    pass 

d = task.deferLater(reactor, 1, client.read_input_status, 0x0000, 8, None) 
d.addCallback(cb) 
d.addErrback(eb) 

我在這裏呼籲deferLater故意要能夠處理錯誤,因爲我明白,使用`使用callLater時是不可能的」。但我的errback永遠不會被調用。

奇怪的是,當試圖調試並查看扭曲的lib代碼時,我想我已經看到了一個原因,爲什麼我的errback沒有效果。我飾發生器功能(如下參數g)被扭曲的defer._inlineCallbacks實現這樣叫(breviated):

def _inlineCallbacks(result, g, deferred): 
    # ... 
    while 1: 
     try: 
      # ... 
      result = g.send(result) 
     except: 
      deferred.errback() 
      return deferred 

我看到我的例外,在最後一節,其中一個延遲的errback可被當時稱爲彈出。但是:這不是我的延遲...如果我去了在調試器的調用層次一個電話,我看到的延遲對象實際上是傳遞給_inlineCallbacks

def unwindGenerator(*args, **kwargs): 
    # ... 
    return _inlineCallbacks(None, gen, Deferred()) 

是我錯了,或者這只是一個新的對象,空的,簡單的,沒有附加回調/ errbacks?

對不起,這冗長的闡述。找不到任何直接相關的東西,除了this SO post,我無法直接看到它如何解決我的問題。

非常感謝。

[更新]有關工作示例代碼(Python 2.7.6,Twisted 13.2.0),請參閱此gist

+0

http://sscce.org/會很好。您的代碼不完整,因此無法運行,因此不容易調試。該錯誤可能出現在您的代碼的某些部分中,在這種情況下,任何人都可以幫助您的唯一方法就是做出令人難以置信的幸運猜測。 –

+0

添加要點讓你進入我所指的堆棧跟蹤:https://gist.github.com/anonymous/8080166 – mikep

回答

3

重讀docs about Twisted Deferred回調函數和errbacks函數後發現它。上面的代碼和鏈接的要點的問題是回調和errback的缺失參數。如果我用以下代碼替換上面寫的內容,那麼異常會很好地捕獲,並按照預期通過errback進行通知:

def cb(result): 
    pass 
def eb(failure): 
    pass