2017-07-05 83 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中刪除一些引用,以使垃圾回收更容易進行。