From 8c94ea283b4bc84640b89a85f76b1ffb6c23a268 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Fri, 24 Apr 2009 15:12:22 +0700 Subject: [PATCH] twistedutil.SimpleSpawnFactory: deliver exceptions to the handler if it does support it --- eventlet/twistedutil/protocol.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/eventlet/twistedutil/protocol.py b/eventlet/twistedutil/protocol.py index 25796f7..af9fde7 100644 --- a/eventlet/twistedutil/protocol.py +++ b/eventlet/twistedutil/protocol.py @@ -20,6 +20,7 @@ # THE SOFTWARE. """Basic twisted protocols converted to synchronous mode""" +import sys from twisted.internet.protocol import Protocol as twistedProtocol from twisted.internet.error import ConnectionDone from twisted.internet.protocol import Factory, ClientFactory @@ -384,7 +385,12 @@ class SimpleSpawnFactory(Factory): gtransport_class = GreenTransport def __init__(self, handler, gtransport_class=None, *args, **kwargs): - self.handler = handler + if callable(handler): + self.handler = handler + else: + self.handler = handler.send + if hasattr(handler, 'send_exception'): + self.exc_handler = handler.send_exception if gtransport_class is not None: self.gtransport_class = gtransport_class self.args = args @@ -401,8 +407,12 @@ class SimpleSpawnFactory(Factory): proc.spawn_greenlet(self._run_handler, gtransport, protocol) def _run_handler(self, gtransport, protocol): - gtransport._init_transport() - self.handler(gtransport) + try: + gtransport._init_transport() + except Exception: + self.exc_handler(*sys.exc_info()) + else: + self.handler(gtransport) class SpawnFactory(SimpleSpawnFactory):