2017-07-05 1 views
0

J'ai un projet qui utilise tordu. Dans une classe enfant de twisted.internet.protocol.ClientFactory, il existe des méthodes pour clientConnectionLost/clientConnectionFailed. Lorsqu'une erreur se produit dans l'échange de données, cette méthode d'exécution avec connecteur et raison. Je peux regarder le type et la valeur de l'exception. Mais je n'ai pas trouvé d'informations sur la façon de le supprimer. Après le traitement, il est levé en tant qu'erreur non gérée. Et je ne peux pas faire un gestionnaire d'exception global, j'ai besoin de gérer les exceptions en fonction du type et de la valeur dans ce contexte (et re-connecter etc).tordu clientConnectionLost catch/supress Exception

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

Des idées?

+0

http://sscce.org/ –

+0

Vous ne comprenez pas vraiment ce code ou vous voulez juste regarder un smarty? OK, je suis un exemple autonome écrit. – Victor

+0

Votre question n'était pas claire auparavant. Vos modifications semblent l'avoir clarifié. Merci. –

Répondre

0

Ce code:

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

est fondamentalement cassé. Le réacteur vous fait une faveur et enregistre l'exception pour vous (serait être assez terrible si elle n'a pas au moins faire cela). Vous pouvez «gérer» cette exception au moyen du système de journalisation, mais le réacteur ne vous donne pas d'autres moyens de le gérer. Cela est dû au fait qu'une levée d'une exception à partir de connectionMade est une violation de l'interface de protocole.

La solution consiste à gérer l'exception à l'intérieur de connectionMade (ou dataReceived ou l'une des autres méthodes de protocole que vous utilisez peut-être). Par exemple:

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

Notez que cleanFailure ne fait rien lié à ce que vous voulez ici. Il récupère juste quelques références sur le Failure pour que la récupération de place s'effectue plus facilement.