В 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 обработался бы базовым классом.