Ответ
BaseException
— это корневой класс для всех встроенных исключений в Python. Exception
наследуется от него и является базовым классом для всех "обычных" ошибок.
Иерархия и назначение
-
BaseException
- Находится на вершине иерархии.
- Включает системные исключения, которые обычно не должны перехватываться в прикладном коде, так как они сигнализируют о необходимости завершить программу.
- Примеры:
SystemExit
(вызываетсяsys.exit()
),KeyboardInterrupt
(нажатиеCtrl+C
),GeneratorExit
.
-
Exception
- Наследуется от
BaseException
. - Является базовым классом для всех стандартных, несистемных исключений.
- Именно его (или его потомков) следует использовать в блоках
except
для обработки ошибок. - Примеры:
ValueError
,TypeError
,KeyError
,ImportError
.
- Наследуется от
Ключевое правило
В блоке
try...except
всегда перехватывайтеException
или его более конкретных потомков, а неBaseException
. ПерехватBaseException
может замаскировать важные системные сигналы и помешать корректному завершению программы.
Пример:
try:
# Имитируем нажатие Ctrl+C пользователем
raise KeyboardInterrupt
except Exception as e:
# Этот блок НЕ выполнится, так как KeyboardInterrupt не является потомком Exception
print(f"Перехвачено Exception: {e}")
except BaseException as e:
# Этот блок сработает, так как KeyboardInterrupt наследуется от BaseException
print(f"Перехвачено BaseException: {e}")
# Вывод:
# Перехвачено BaseException:
Таким образом, BaseException
существует для создания общей иерархии, но в практике программирования почти всегда следует работать с Exception
.