如何在Twisted中调试Protocol.dataReceived

时间:2016-08-30 15:22:29

标签: python asynchronous twisted

我刚开始扭曲,我无法在dataReceived对象的twisted.internet.protocol.Protocol方法中调试我的代码。

给出一些像这样的代码

class Printer(Protocol):
    def dataReceived(self, data):
        print data # Works perfectly
        print toto # should trigger some error since "toto" is not defined
...
response.deliverBody(Printer())

我找不到在Errback上添加dataReceived的方法。有办法吗?调试其行为的另一种方法是什么?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您无法直接从dataReceived抓取错误,因为该功能不是deferred用户通常可以控制的。您只能在addErrback个对象上调用deferred。以下是如何捕获错误的示例:

from twisted.internet.protocol import Protocol
from twisted.internet.defer import Deferred

class Printer(Protocol):
    def dataReceived(self, data):
        d = Deferred()
        d.addCallback(self.display_data)
        d.addErrback(self.error_func)
        d.callback(data)

    def display_data(self, data):
        print(data)
        print(toto)    # this will raise NameError error

    def error_func(self, error):
        print('[!] Whoops here is the error: {0}'.format(error))

deferred函数中创建了dataReceived,该函数将打印data和无效的toto变量。将错误回送函数(即self.error_func())链接起来以捕获display_data()中发生的错误。你应该努力在dataReceived函数本身没有错误。这并不总是可行,但应该尝试。希望这有帮助