2017-07-05 6 views
0

私はツイストを使用するプロジェクトを持っています。 twisted.internet.protocol.ClientFactoryの子クラスには、clientConnectionLost/clientConnectionFailedのメソッドがあります。データ交換でエラーが発生すると、このメソッドはコネクタと理由で実行されます。私は例外の種類と価値を見ることができます。しかし、私はそれを抑圧する方法に関する情報は見つけられませんでした。処理後、未処理エラーとして発生します。グローバルな例外ハンドラを作成することはできません。このコンテキストの型と値に応じて例外を処理する必要があります(再接続など)。twisted 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

あなたは本当にこのコードを理解していないか、スマートに見せたいだけですか?はい、私は自己完結型の例を書いています。 – 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からいくつかの参照を抜き出しています。