diff options
author | Lance Stout <lancestout@gmail.com> | 2010-12-17 13:11:03 -0500 |
---|---|---|
committer | Lance Stout <lancestout@gmail.com> | 2010-12-17 13:11:03 -0500 |
commit | 34c374a1e1dad468869c8e5dc6fb2ea7b1d90c7e (patch) | |
tree | 450f0d6a299effe6facd3ab82956e9da74807dcc /sleekxmpp | |
parent | 506eccf84d86ccf428e1edd8092fdac46f1633fe (diff) | |
download | slixmpp-34c374a1e1dad468869c8e5dc6fb2ea7b1d90c7e.tar.gz slixmpp-34c374a1e1dad468869c8e5dc6fb2ea7b1d90c7e.tar.bz2 slixmpp-34c374a1e1dad468869c8e5dc6fb2ea7b1d90c7e.tar.xz slixmpp-34c374a1e1dad468869c8e5dc6fb2ea7b1d90c7e.zip |
Make tests pass for catching exceptions.
May now use sys.excepthook to catch exceptions
from threaded handlers.
Diffstat (limited to 'sleekxmpp')
-rw-r--r-- | sleekxmpp/stanza/rootstanza.py | 2 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/xmlstream.py | 24 |
2 files changed, 25 insertions, 1 deletions
diff --git a/sleekxmpp/stanza/rootstanza.py b/sleekxmpp/stanza/rootstanza.py index 777314b9..8123c5f8 100644 --- a/sleekxmpp/stanza/rootstanza.py +++ b/sleekxmpp/stanza/rootstanza.py @@ -64,7 +64,7 @@ class RootStanza(StanzaBase): log.exception('Error handling {%s}%s stanza' % (self.namespace, self.name)) # Finally raise the exception, so it can be handled (or not) - # at a higher level + # at a higher level by using sys.excepthook. raise e register_stanza_plugin(RootStanza, Error) diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py index 2317f04c..d5c1043b 100644 --- a/sleekxmpp/xmlstream/xmlstream.py +++ b/sleekxmpp/xmlstream/xmlstream.py @@ -682,6 +682,7 @@ class XMLStream(object): Event handlers and the send queue will be threaded regardless of this parameter's value. """ + self._thread_excepthook() self.scheduler.process(threaded=True) def start_thread(name, target): @@ -954,3 +955,26 @@ class XMLStream(object): self.disconnect() self.event_queue.put(('quit', None, None)) return + + def _thread_excepthook(self): + """ + If a threaded event handler raises an exception, there is no way to + catch it except with an excepthook. Currently, each thread has its own + excepthook, but ideally we could use the main sys.excepthook. + + Modifies threading.Thread to use sys.excepthook when an exception + is not caught. + """ + init_old = threading.Thread.__init__ + def init(self, *args, **kwargs): + init_old(self, *args, **kwargs) + run_old = self.run + def run_with_except_hook(*args, **kw): + try: + run_old(*args, **kw) + except (KeyboardInterrupt, SystemExit): + raise + except: + sys.excepthook(*sys.exc_info()) + self.run = run_with_except_hook + threading.Thread.__init__ = init |