Ответ 1
Похоже, есть связанная ошибка, сообщенная здесь с обходными решениями. Предлагаемые хаки в основном завершают работу в try/catch, а затем вызывают sys.excepthook(*sys.exc_info())
Я использую Python 2.5 и пытаюсь использовать самоопределяемый excepthook
в своей программе. В основной нити он отлично работает. Но в потоке, запущенном с помощью модуля потоковой передачи, вызывается обычный excepthook
.
Вот пример, показывающий проблему. Разоблачение комментария показывает желаемое поведение.
import threading, sys
def myexcepthook(type, value, tb):
print 'myexcepthook'
class A(threading.Thread, object):
def __init__(self):
threading.Thread.__init__(self, verbose=True)
# raise Exception('in main')
self.start()
def run(self):
print 'A'
raise Exception('in thread')
if __name__ == "__main__":
sys.excepthook = myexcepthook
A()
Итак, как я могу использовать свой собственный excepthook
в потоке?
Похоже, есть связанная ошибка, сообщенная здесь с обходными решениями. Предлагаемые хаки в основном завершают работу в try/catch, а затем вызывают sys.excepthook(*sys.exc_info())
Похоже, что эта ошибка все еще присутствует (по крайней мере) 3.4, и один из обходных путей в обсуждении, связанный с Nadia Alramli, похоже, тоже работает на Python 3.4.
Для удобства и документации, я отправлю код для (на мой взгляд) лучшего обходного пути здесь. Я немного обновил стиль кодирования и комментарии, чтобы сделать его более PEP8 и 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