twisted clientConnectionLost catch / suppress Exception

时间:2017-07-05 09:46:16

标签: python exception exception-handling twisted

我有一个使用扭曲的项目。在twisted.internet.protocol.ClientFactory的子类中,有clientConnectionLost / clientConnectionFailed的方法。当数据交换发生错误时,此方法执行连接器和原因。我可以看一下异常的类型和价值。但我没有找到有关如何抑制它的信息。处理完毕后,它会被提升为未处理错误。我不能创建一个全局异常处理程序,我需要处理异常,具体取决于此上下文中的类型和值(并重新连接等)。

class MyProtocol(Protocol):
    def connectionMade(self):
        raise Exception('Connect error')


class Client(ClientFactory):
    protocol = MyProtocol

    def clientConnectionLost(self, connector, reason):
        print reason.type, reason.value  # show type and message, OK
        reason.cleanFailure()  # ???


reactor.connectTCP('127.0.0.1', 80, Client())
reactor.run()

# Unhandled Error
# Traceback (most recent call last): ...............

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

此代码:

class MyProtocol(Protocol):
    def connectionMade(self):
        raise Exception('Connect error')

基本上被打破了。反应堆帮你一个忙,并为你记录异常(如果它至少没有那么非常可怕)。您可以通过记录系统“处理”此异常,但反应堆不会为您提供任何其他设施来处理它。

这是因为从connectionMade引发异常违反了协议接口。

解决方案是在connectionMade(或dataReceived或您可能正在使用的任何其他协议方法)中处理异常。例如:

class MyProtocol(Protocol):
    def connectionMade(self):
        try:
            raise Exception('Connect error')
        except ...:
            ...

请注意cleanFailure没有做任何与此相关的事情。它只是从Failure中删除了一些引用,以便更容易地进行垃圾收集。