From 0214db75451627c4e0d666e8567db24da31e4056 Mon Sep 17 00:00:00 2001
From: Lance Stout <lancestout@gmail.com>
Date: Wed, 3 Nov 2010 12:38:13 -0400
Subject: Catch exceptions for direct events.

Events triggered with direct=True will have exceptions caught.

Note that all event handlers in a direct event will currently run
in the same thread.
---
 sleekxmpp/xmlstream/xmlstream.py | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py
index cc192715..d47557b7 100644
--- a/sleekxmpp/xmlstream/xmlstream.py
+++ b/sleekxmpp/xmlstream/xmlstream.py
@@ -535,13 +535,22 @@ class XMLStream(object):
             name     -- The name of the event to trigger.
             data     -- Data that will be passed to each event handler.
                         Defaults to an empty dictionary.
-            direct   -- Runs the event directly if True.
+            direct   -- Runs the event directly if True, skipping the 
+                        event queue. All event handlers will run in the
+                        same thread.
         """
         for handler in self.__event_handlers.get(name, []):
             if direct:
-                handler[0](copy.copy(data))
+                try:
+                    handler[0](copy.copy(data))
+                except Exception as e:
+                    error_msg = 'Error processing event handler: %s'
+                    logging.exception(error_msg % str(handler[0]))
+                    if hasattr(data, 'exception'):
+                        data.exception(e)
             else:
                 self.event_queue.put(('event', handler, copy.copy(data)))
+
             if handler[2]:
                 # If the handler is disposable, we will go ahead and
                 # remove it now instead of waiting for it to be
@@ -807,11 +816,6 @@ class XMLStream(object):
         """
         try:
             func(*args)
-        except Exception as e:
-            error_msg = 'Error processing event handler: %s'
-            logging.exception(error_msg % str(func))
-            if hasattr(args[0], 'exception'):
-                args[0].exception(e)
 
     def _event_runner(self):
         """
-- 
cgit v1.2.3