Python Glossary English

Python 3.8+sysфункция

sys.unraisablehook()

исключения

Функция, получающая исключения, которые некуда пробросить: из __del__, из финализаторов и сборщика мусора. По умолчанию печатает их в stderr.

Синтаксис

sys.unraisablehook = hook  # hook(unraisable)

Ошибка в __del__ не прерывает программу и не ловится try вокруг del — она уходит сюда, и на экране остаётся только «Exception ignored in …». Поэтому такие баги живут годами незамеченными; тесты делают их видимыми, подменяя хук. Хук получает один объект с полями exc_type, exc_value, exc_traceback, err_msg и object. Хранить exc_value после возврата из хука опасно: так воскрешается объект, который уже удаляется.

Примеры

import sys
seen = []
sys.unraisablehook = lambda u: seen.append((u.exc_type.__name__, str(u.exc_value)))
class Bad:
    def __del__(self):
        raise RuntimeError('del failed')
b = Bad()
try:
    del b
except RuntimeError:
    print('поймано')
sys.unraisablehook = sys.__unraisablehook__
print(seen)  # → [('RuntimeError', 'del failed')]

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности