Иерархия исключений: BaseException, Exception и их наследники

Иерархия исключений: BaseException, Exception и их наследники Обработка исключений

Привет! Ты уже умеешь использовать try-except, вызывать исключения с raise и даже создавать свои собственные ошибки. Но задумывался ли ты о том, как все эти исключения связаны между собой? Почему не стоит писать except BaseException? И чем отличается KeyboardInterrupt от ValueError?

В этой статье мы разберём:

  • Что такое иерархия исключений
  • BaseException и почему его не стоит перехватывать
  • Exception — правильный корень для пользовательских исключений
  • Ключевые встроенные исключения: ValueErrorTypeErrorKeyError и другие
  • 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
  • SystemExitKeyboardInterrupt и GeneratorExit наследуются напрямую от BaseException (не через Exception)
  • BaseException почти никогда не перехватывают явно

Почему не стоит перехватывать BaseException:

# Так делать не стоит
try:
    # код
except BaseException:
    print('Это поймает всё, включая нажатие Ctrl+C')

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×