Ответ
Иерархия исключений в 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}")