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