Что представляет собой иерархия исключений в Python

Ответ

Иерархия исключений в Python — это древовидная структура встроенных классов, где все исключения наследуются от базового класса BaseException. Понимание этой иерархии позволяет писать более точный и надежный код для обработки ошибок.

Структура иерархии

Ключевые классы в иерархии организованы следующим образом:

BaseException
 ├── SystemExit
 ├── KeyboardInterrupt
 └── Exception
      ├── ArithmeticError
      │    ├── ZeroDivisionError
      │    └── OverflowError
      ├── AssertionError
      ├── AttributeError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      └── ValueError

Ключевые принципы

  1. Наследование: Все исключения являются потомками BaseException.
  2. Перехват: Блок except перехватывает как указанный класс исключения, так и всех его потомков. Это позволяет обрабатывать группы ошибок (например, except LookupError: ловит и IndexError, и KeyError).
  3. Пользовательские исключения: Рекомендуется создавать свои классы исключений, наследуя их от Exception или его потомков, но не от BaseException.
  4. BaseException: Перехват BaseException — плохая практика, так как он включает системные сигналы выхода (SystemExit, KeyboardInterrupt), которые обычно не должны подавляться.

Пример обработки

Порядок блоков except важен: от более конкретного к более общему.

data = {'key': 'value'}
try:
    # Попытка доступа по несуществующему ключу
    print(data['missing_key'])
except KeyError as e:
    # Этот блок сработает, так как KeyError - более специфичное исключение
    print(f"Ошибка доступа к ключу: {e}")
except LookupError as e:
    # Этот блок не сработает, так как KeyError (потомок LookupError) уже был перехвачен
    print(f"Общая ошибка поиска: {e}")