Python 3.8+threadingфункция
threading.excepthook()
ошибки в потоках
Функция, которую вызывают для необработанного исключения в Thread.run(); её можно заменить своей — например, чтобы писать ошибки потоков в лог.
Синтаксис
threading.excepthook = hook # def hook(args: threading.ExceptHookArgs)
Исключение в потоке не доходит до главного: join() вернётся как обычно, программа пойдёт дальше, а след останется только в stderr — ошибку легко пропустить. Своя функция в threading.excepthook перехватывает такие падения во всех потоках; sys.excepthook на потоки не действует. Хук работает в упавшем потоке и сам не должен бросать исключений (иначе вызовется sys.excepthook); SystemExit по умолчанию игнорируется молча. Исходный хук лежит в threading.__excepthook__. Пул concurrent.futures хук не зовёт: там исключение достаётся из future.result().
Примеры
# Python 3.10+
import threading
errors = []
def log_error(args):
errors.append(f'{args.thread.name}: {args.exc_type.__name__}: {args.exc_value}')
threading.excepthook = log_error
def job():
1 / 0
t = threading.Thread(target=job, name='calc')
t.start()
t.join()
threading.excepthook = threading.__excepthook__
print(errors) # → ['calc: ZeroDivisionError: division by zero']
import threading
def job():
raise ValueError('oops')
t = threading.Thread(target=job)
t.start()
t.join() # трассировка «Exception in thread ...» ушла в stderr
print('main is alive') # → main is alive
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности