Junior
50
questionbank

Расскажите об иерархии исключений в Python.

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

В Python исключения организованы в иерархическое дерево, вершиной которого является класс BaseException.

Основные ветви и классы:

  • BaseException: Базовый класс для всех исключений. Не предназначен для прямого перехвата в большинстве случаев.
    • SystemExit: Возникает при выходе из программы, например, по вызову sys.exit().
    • KeyboardInterrupt: Генерируется при прерывании выполнения программы пользователем (обычно Ctrl+C).
    • GeneratorExit: Возникает при закрытии генератора.
    • Exception: Базовый класс для большинства обрабатываемых исключений. Именно его обычно перехватывают в блоках except.
      • StopIteration: Генерируется итератором, чтобы сигнализировать об отсутствии элементов.
      • ArithmeticError: Базовый класс для ошибок в арифметических операциях.
        • FloatingPointError: Ошибка операций с плавающей точкой (редко).
        • OverflowError: Результат арифметической операции слишком велик.
        • ZeroDivisionError: Деление на ноль.
      • AssertionError: Ошибка при неудачном assert.
      • AttributeError: Попытка доступа к несуществующему атрибуту объекта.
      • EOFError: Ошибка при достижении конца файла без чтения данных.
      • ImportError: Ошибка при невозможности импортировать модуль/имя.
        • ModuleNotFoundError: Модуль не найден.
      • LookupError: Базовый класс для ошибок при поиске по ключу/индексу.
        • IndexError: Неверный индекс последовательности.
        • KeyError: Неверный ключ в словаре.
      • NameError: Попытка использования неопределенной переменной/имени.
        • UnboundLocalError: Попытка доступа к локальной переменной в функции до присвоения ей значения.
      • OSError: Ошибки, связанные с операционной системой (файлы, процессы и т.д.). Включает множество подклассов.
        • FileNotFoundError: Файл или директория не найдена.
        • IsADirectoryError: Файл ожидался, но найдена директория.
        • NotADirectoryError: Директория ожидалась, но найден файл.
        • PermissionError: Ошибка доступа (например, нет прав на чтение/запись).
        • ProcessLookupError: Процесс с указанным PID не существует.
        • TimeoutError: Операция превысила установленное время ожидания.
      • RuntimeError: Ошибка, не попадающая под другие категории RuntimeWarning.
        • RecursionError: Превышена максимальная глубина рекурсии.
      • SyntaxError: Ошибка синтаксиса кода.
        • IndentationError: Неверный отступ.
      • SystemError: Внутренняя ошибка интерпретатора Python.
      • TypeError: Операция применена к объекту неподходящего типа.
      • ValueError: Операция получила аргумент правильного типа, но с некорректным значением.
      • RuntimeWarning: Предупреждение времени выполнения (не исключение, но часто связано).
      • ... (много других, специфичных для модулей или ситуаций)

При перехвате исключений, except блоки обрабатываются сверху вниз. Важно перехватывать более специфичные исключения до их базовых классов, чтобы избежать их поглощения.

Пример:

python

Если бы except LookupError стоял перед except KeyError, KeyError обработался бы базовым классом.