如何在 Twisted 中调试 Protocol.dataReceived

How to debug Protocol.dataReceived in Twisted

我是 twisted 的新手,在 twisted.internet.protocol.Protocol 对象的 dataReceived 方法中调试我的代码时遇到问题。

给定一些这样的代码

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())

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

在此先感谢您的帮助。

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

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))

A deferreddataReceived 函数中创建,它将打印 data 和无效的 toto 变量。 errorback 函数(即 self.error_func())被链接起来以捕获 display_data() 中发生的错误。您应该努力避免 dataReceived 函数本身出现错误。这并不总是可能的,但应该尝试一下。希望这有帮助