2017-07-05 47 views
0

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

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

任何想法?

+0

http://sscce.org/ –

+0

你真的不理解这段代码,或者只是想看看smarty?好吧,我写的自成一体的例子。 – Victor

+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中删除一些引用,以使垃圾回收更容易进行。