Sobes.tech
Junior
105
questionbank

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

Ответ от нейросети

sobes.tech AI

В 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 блоки обрабатываются сверху вниз. Важно перехватывать более специфичные исключения до их базовых классов, чтобы избежать их поглощения.

Пример:

# Перехват более специфичного исключения до базового
try:
    # Код, который может вызвать исключение
    d = {"a": 1}
    print(d[f"b"])
except KeyError:
    // Обработка отсутствия ключа
    print("Ошибка: Ключ не найден.")
except LookupError:
    // Обработка общих ошибок поиска (включает KeyError и IndexError)
    print("Ошибка: Проблема с поиском элемента.")
except Exception as e:
    // Обработка любых других исключений
    print(f"Произошла другая ошибка: {e}")

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