我有一个使用扭曲的项目。在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): ...............
有什么想法吗?
答案 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
中删除了一些引用,以便更容易地进行垃圾收集。