我開始用扭曲作爲我將使用的庫之一取決於它。在早期的測試中,我感到困惑如何捕捉一個函數拋出這樣的異常:如何從扭曲的inlineCallbacks裝飾函數中捕捉異常?
@defer.inlineCallbacks
def read_input_status(self, address, length, callback):
assert callback
# ...
如果callback
爲None
的AssertionError
被拋出,所以我想看看它...該功能被稱爲像這樣的:
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。
http://sscce.org/會很好。您的代碼不完整,因此無法運行,因此不容易調試。該錯誤可能出現在您的代碼的某些部分中,在這種情況下,任何人都可以幫助您的唯一方法就是做出令人難以置信的幸運猜測。 –
添加要點讓你進入我所指的堆棧跟蹤:https://gist.github.com/anonymous/8080166 – mikep