В чем разница между классами исключений Exception и BaseException в Python

Ответ

BaseException — это корневой класс для всех встроенных исключений в Python. Exception наследуется от него и является базовым классом для всех "обычных" ошибок.

Иерархия и назначение

  1. BaseException

    • Находится на вершине иерархии.
    • Включает системные исключения, которые обычно не должны перехватываться в прикладном коде, так как они сигнализируют о необходимости завершить программу.
    • Примеры: SystemExit (вызывается sys.exit()), KeyboardInterrupt (нажатие Ctrl+C), GeneratorExit.
  2. 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.