Python Glossary English

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Сообщить о неточности