except*. Это позволит более удобным образом спроектировать API в различных местах stdlib и сторонних библиотек, а также сделает поведение более правильным и в некоторых краевых случаях позволит не терять исключения.Вот так можно будет запустить группу исключений:
raise ExceptionGroup(
"everything is bad",
[
ValueError("bad value"),
TypeError("bad type")
],
)
Можно создавать из групп исключений целые иерархии и запускать их (вложить ExceptionGroup внутрь ExceptionGroup).Исключения
ExceptionGroup можно перехватывать как обычные исключения (при помощи except), а можно вот так разбивать группу на отдельные исключения и обрабатывать в каждом блоке except* исключения только определенного типа:try:
...
except *TypeError:
print("type is bad")
except *ValueError as e:
assert isinstance(e, ExceptionGroup) # it's a group!
print("value is bad")
При выполнении куска кода выше по идее должно будет напечататься следующее:type is bad
value is bad
То есть будут выполнены сразу два блока except*. Причём в каждый блок except* приходит не одно исключение, а целая группа. Обработанные исключения удаляются из исходной группы, а необработанные идут по следующим блокам except*. При разбивании группы исключений на подгруппы происходит обход группы как дерева. Если после проверки всех блоков группа исключений осталась непустой, то она рейзится дальше. Нельзя для одного блока try иметь и обычный except, и групповой except*.Да, группировка исключений — это весьма своеобразная фича. Авторы документа не предполагают, что такой способ работы с исключениями получит широкое распространение. Насколько я понимаю, этот новый механизм создаётся для решения каких-то специфичных проблем.