Module (90%)
Section (40%)

Исключения - это классы

Все встроенные исключения Python образуют иерархию классов. Нет никаких препятствий для ее расширения, если Вы считаете это разумным.

Посмотрите на код в редакторе.

Эта программа выводит все предопределенные классы исключений в виде древовидной распечатки.

Поскольку дерево является прекрасным примером рекурсивной структуры данных, рекурсия, кажется, - это лучший инструмент для прохождения по нему. Функция printExcTree() принимает два аргумента:

  • точку внутри дерева, с которой мы начинаем его обход;
  • уровень вложенности (мы будем использовать его для создания упрощенного чертежа ветвей дерева).

Начнем с корня дерева - корнем классов исключений в Python является класс BaseException (это суперкласс всех других исключений).

Для каждого из обнаруженных классов выполните один и тот же набор операций:

  • вывести его имя, взятое из свойства __name__;
  • перебрать список подклассов, предоставляемых методом __subclasses__(), и рекурсивный вызов функцию printExcTree(), соответственно увеличивая уровень вложенности.

Обратите внимание, как мы нарисовали ветви и вилки. Вывод никак не сортируется - Вы можете попытаться отсортировать его самостоятельно. Более того, есть некоторые неточности в том, как некоторые ветви представлены. Это тоже можно исправить, если хотите.

Вот как это выглядит:

BaseException +---Exception | +---TypeError | +---StopAsyncIteration | +---StopIteration | +---ImportError | | +---ModuleNotFoundError | | +---ZipImportError | +---OSError | | +---ConnectionError | | | +---BrokenPipeError | | | +---ConnectionAbortedError | | | +---ConnectionRefusedError | | | +---ConnectionResetError | | +---BlockingIOError | | +---ChildProcessError | | +---FileExistsError | | +---FileNotFoundError | | +---IsADirectoryError | | +---NotADirectoryError | | +---InterruptedError | | +---PermissionError | | +---ProcessLookupError | | +---TimeoutError | | +---UnsupportedOperation | | +---herror | | +---gaierror | | +---timeout | | +---Error | | | +---SameFileError | | +---SpecialFileError | | +---ExecError | | +---ReadError | +---EOFError | +---RuntimeError | | +---RecursionError | | +---NotImplementedError | | +---_DeadlockError | | +---BrokenBarrierError | +---NameError | | +---UnboundLocalError | +---AttributeError | +---SyntaxError | | +---IndentationError | | | +---TabError | +---LookupError | | +---IndexError | | +---KeyError | | +---CodecRegistryError | +---ValueError | | +---UnicodeError | | | +---UnicodeEncodeError | | | +---UnicodeDecodeError | | | +---UnicodeTranslateError | | +---UnsupportedOperation | +---AssertionError | +---ArithmeticError | | +---FloatingPointError | | +---OverflowError | | +---ZeroDivisionError | +---SystemError | | +---CodecRegistryError | +---ReferenceError | +---BufferError | +---MemoryError | +---Warning | | +---UserWarning | | +---DeprecationWarning | | +---PendingDeprecationWarning | | +---SyntaxWarning | | +---RuntimeWarning | | +---FutureWarning | | +---ImportWarning | | +---UnicodeWarning | | +---BytesWarning | | +---ResourceWarning | +---error | +---Verbose | +---Error | +---TokenError | +---StopTokenizing | +---Empty | +---Full | +---_OptionError | +---TclError | +---SubprocessError | | +---CalledProcessError | | +---TimeoutExpired | +---Error | | +---NoSectionError | | +---DuplicateSectionError | | +---DuplicateOptionError | | +---NoOptionError | | +---InterpolationError | | | +---InterpolationMissingOptionError | | | +---InterpolationSyntaxError | | | +---InterpolationDepthError | | +---ParsingError | | | +---MissingSectionHeaderError | +---InvalidConfigType | +---InvalidConfigSet | +---InvalidFgBg | +---InvalidTheme | +---EndOfBlock | +---BdbQuit | +---error | +---_Stop | +---PickleError | | +---PicklingError | | +---UnpicklingError | +---_GiveupOnSendfile | +---error | +---LZMAError | +---RegistryError | +---ErrorDuringImport +---GeneratorExit +---SystemExit +---KeyboardInterrupt

output



Code

def printExcTree(thisclass, nest = 0):
if nest > 1:
print(" |" * (nest - 1), end="")
if nest > 0:
print(" +---", end="")

print(thisclass.__name__)

for subclass in thisclass.__subclasses__():
printExcTree(subclass, nest + 1)


printExcTree(BaseException)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×