Написать класс ExceptionTree, экземпляр которого конструирует объекты-исключения, иерархия которых соответствует двоичному дереву:
Exception-1 / \ Exception-2 Exception-3 / \ / \ Exception-4 Exception-5 Exception-6 Exception-7 … и т. д.
Единственный параметр при вызове экземпляра — индекс исключения в этом дереве. Индекс хранится также в самом исключении в виде поля .n.
1 etree = ExceptionTree()
2 excs = [etree(i) for i in (1, 2, 5, 12, 20)]
3 for Ethrow in excs:
4 print(f"Throw {Ethrow.n}", end="")
5 for Ecatch in excs:
6 if Ethrow != Ecatch:
7 try:
8 raise Ethrow
9 except Ecatch:
10 print(f", {Ecatch.n} caught", end="")
11 except Exception:
12 print(f", {Ecatch.n} missed", end="")
13 print()
Подсказка 0 от К. О.: надо написать метод .__call__()
Подсказка 1: классы удобно изготавливать с помощью type()
Подсказка 2: у Exception-N достаточно единственного предка — Exception-N//2
Throw 1, 2 missed, 5 missed, 12 missed, 20 missed Throw 2, 1 caught, 5 missed, 12 missed, 20 missed Throw 5, 1 caught, 2 caught, 12 missed, 20 missed Throw 12, 1 caught, 2 missed, 5 missed, 20 missed Throw 20, 1 caught, 2 caught, 5 caught, 12 missed