Ответ
Иерархия исключений в Python — это древовидная структура встроенных классов, где все исключения наследуются от базового класса BaseException. Понимание этой иерархии позволяет писать более точный и надежный код для обработки ошибок.
Структура иерархии
Ключевые классы в иерархии организованы следующим образом:
BaseException
├── SystemExit
├── KeyboardInterrupt
└── Exception
├── ArithmeticError
│ ├── ZeroDivisionError
│ └── OverflowError
├── AssertionError
├── AttributeError
├── LookupError
│ ├── IndexError
│ └── KeyError
└── ValueError
Ключевые принципы
- Наследование: Все исключения являются потомками
BaseException. - Перехват: Блок
exceptперехватывает как указанный класс исключения, так и всех его потомков. Это позволяет обрабатывать группы ошибок (например,except LookupError:ловит иIndexError, иKeyError). - Пользовательские исключения: Рекомендуется создавать свои классы исключений, наследуя их от
Exceptionили его потомков, но не отBaseException. 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}")