From 6ff939ab3a751071060c9fcaae77f80aa5473dfd Mon Sep 17 00:00:00 2001 From: Pierre Fersing Date: Thu, 14 Jan 2016 10:10:08 +0100 Subject: [PATCH] Catch uncaught exception from thread --- raven/base.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/raven/base.py b/raven/base.py index 21d7a178f..6528995ff 100644 --- a/raven/base.py +++ b/raven/base.py @@ -12,6 +12,7 @@ import logging import os import sys +import threading import time import uuid import warnings @@ -183,6 +184,7 @@ def __init__(self, dsn=None, raise_send_errors=False, transport=None, if install_sys_hook: self.install_sys_hook() + self.install_thread_hook() def set_dsn(self, dsn=None, transport=None): if dsn is None and os.environ.get('SENTRY_DSN'): @@ -217,6 +219,26 @@ def handle_exception(*exc_info): __excepthook__(*exc_info) sys.excepthook = handle_exception + def install_thread_hook(self): + """ + Workaround for sys.excepthook thread bug, http://bugs.python.org/issue1230540 + """ + init_old = threading.Thread.__init__ + raven_self = self + 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: + raven_self.captureException(exc_info=sys.exc_info()) + raise + self.run = run_with_except_hook + threading.Thread.__init__ = init + @classmethod def register_scheme(cls, scheme, transport_class): cls._registry.register_scheme(scheme, transport_class)