Ответ
В 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:
, если у вас нет веской причины для обработки системных событий завершения.