Browse files

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.
  • Loading branch information...
1 parent ffc6f03 commit 0214db75451627c4e0d666e8567db24da31e4056 @legastero legastero committed Nov 3, 2010
Showing with 11 additions and 7 deletions.
  1. +11 −7 sleekxmpp/xmlstream/xmlstream.py
View
18 sleekxmpp/xmlstream/xmlstream.py
@@ -535,13 +535,22 @@ def event(self, name, data={}, direct=False):
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 @@ def _threaded_event_wrapper(self, func, args):
"""
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):
"""

0 comments on commit 0214db7

Please sign in to comment.