Привет! Ты уже умеешь использовать try-except, вызывать исключения с raise и даже создавать свои собственные ошибки. Но задумывался ли ты о том, как все эти исключения связаны между собой? Почему не стоит писать except BaseException? И чем отличается KeyboardInterrupt от ValueError?
В этой статье мы разберём:
- Что такое иерархия исключений
- BaseException и почему его не стоит перехватывать
- Exception — правильный корень для пользовательских исключений
- Ключевые встроенные исключения:
ValueError,TypeError,KeyErrorи другие - SystemExit и KeyboardInterrupt — исключения для выхода из программы
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание исключений и
try-except - Желание разобраться, как устроены ошибки в Python
Совет: Понимание иерархии исключений поможет тебе писать более правильную обработку ошибок. Ты перестанешь перехватывать всё подряд и сможешь делать код надёжнее.
Основная часть
Что такое иерархия исключений?
Все исключения в Python организованы в иерархию (дерево наследования). В вершине находится BaseException. От него наследуются Exception и несколько особых исключений. А уже от Exception наследуется большинство встроенных ошибок, которые ты встречаешь.
BaseException
├── SystemExit
├── KeyboardInterrupt
├── GeneratorExit
└── Exception
├── StopIteration
├── StopAsyncIteration
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ └── ...
├── RuntimeError
│ └── ...
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
└── ...Совет:
BaseException— вершина иерархии. Но ты почти никогда не будешь использовать её напрямую. Работай сExceptionи его наследниками.
BaseException — корень всех исключений
BaseException — это базовый класс для всех исключений. Он существует, чтобы гарантировать, что абсолютно любую ошибку можно перехватить.
Особенности:
- Все исключения наследуются от
BaseException SystemExit,KeyboardInterruptиGeneratorExitнаследуются напрямую отBaseException(не черезException)BaseExceptionпочти никогда не перехватывают явно
Почему не стоит перехватывать BaseException:
# Так делать не стоит
try:
# код
except BaseException:
print('Это поймает всё, включая нажатие Ctrl+C')





