Какие исключения в Python не наследуются от класса Exception

Ответ

В Python существуют исключения, которые наследуются напрямую от BaseException, минуя Exception. Их не рекомендуется перехватывать стандартным блоком except Exception:, так как они сигнализируют о системных событиях, а не об ошибках в логике программы.

Ключевые примеры:

  • SystemExit: Вызывается функцией sys.exit() для штатного завершения программы.
  • KeyboardInterrupt: Возникает при нажатии Ctrl+C пользователем в терминале.
  • GeneratorExit: Сообщает о закрытии генератора.

Перехват этих исключений нарушает ожидаемое поведение программы (например, пользователь не сможет прервать выполнение скрипта).

Пример демонстрации:

import sys

try:
    print("Программа запущена. Нажмите Ctrl+C для прерывания...")
    # sys.exit() # Раскомментируйте, чтобы проверить SystemExit
    while True:
        pass
except Exception as e:
    # Этот блок НЕ сработает для KeyboardInterrupt или SystemExit
    print(f"Перехвачено стандартное исключение: {e}")
except BaseException as e:
    # А этот блок сработает
    print(f"Перехвачено базовое исключение: {type(e).__name__}. Программа завершается.")

Best practice: Избегайте конструкций except BaseException: или except:, если у вас нет веской причины для обработки системных событий завершения.