'sys.excepthook' and threading

前端 未结 3 676
遥遥无期
遥遥无期 2020-12-01 12:12

I am using Python 2.5 and trying to use a self-defined excepthook in my program. In the main thread it works perfectly fine. But in a thread started with the th

相关标签:
3条回答
  • 2020-12-01 12:47

    I just stumbled over this problem and as it turns out, it was the right time to do so.

    New in version 3.8: threading.excepthook

    Handle uncaught exception raised by Thread.run().

    The args argument has the following attributes:

    exc_type: Exception type.
    exc_value: Exception value, can be None.
    exc_traceback: Exception traceback, can be None.
    thread: Thread which raised the exception, can be None.

    I don't know why, but be aware, that unlike sys.excepthook, threading.excepthook receives the arguments as a namedtuple instead of multiple arguments.

    0 讨论(0)
  • 2020-12-01 12:53

    It looks like there is a related bug reported here with workarounds. The suggested hacks basically wrap run in a try/catch and then call sys.excepthook(*sys.exc_info())

    0 讨论(0)
  • 2020-12-01 13:06

    It looks like this bug is still present in (at least) 3.4, and one of the workarounds in the discussion Nadia Alramli linked seems to work in Python 3.4 too.

    For convenience and documentation sake, I'll post the code for (in my opinion) the best workaround here. I updated the coding style and comments slightly to make it more PEP8 and Pythonic.

    import sys
    import threading
    
    def setup_thread_excepthook():
        """
        Workaround for `sys.excepthook` thread bug from:
        http://bugs.python.org/issue1230540
    
        Call once from the main thread before creating any threads.
        """
    
        init_original = threading.Thread.__init__
    
        def init(self, *args, **kwargs):
    
            init_original(self, *args, **kwargs)
            run_original = self.run
    
            def run_with_except_hook(*args2, **kwargs2):
                try:
                    run_original(*args2, **kwargs2)
                except Exception:
                    sys.excepthook(*sys.exc_info())
    
            self.run = run_with_except_hook
    
        threading.Thread.__init__ = init
    
    0 讨论(0)
提交回复
热议问题