В обработке исключений в Python ключевое отличие состоит в том, что именно ловит каждая конструкция:
except Exception ловит все стандартные ошибки времени выполнения и исключенияexcept: ловит всё, включая исключения, которые наследуются от BaseExceptionBaseException
├── SystemExit # вызывается через sys.exit()
├── KeyboardInterrupt # вызывается при Ctrl+C
├── GeneratorExit # вызывается при закрытии генератора
└── Exception # все стандартные исключения (ValueError, TypeError, и т.д.)
except Exception не поймает SystemExit, KeyboardInterrupt или GeneratorExit, потому что они наследуются непосредственно от BaseException, а не от Exception.
Голый except: ловит всё вышеперечисленное.
except Exception предпочтителенИспользование голого except: считается плохой практикой, потому что:
KeyboardInterrupt, мешая пользователям остановить программу через Ctrl+CSystemExit, блокируя намеренное завершение программы через sys.exit()Всегда предпочитай except Exception для общей обработки ошибок и явно лови исключения системного уровня только когда у тебя есть веская причина:
try:
risky_operation()
except KeyboardInterrupt:
print("User interrupted")
except Exception as e:
print(f"Handled error: {e}")
Такой подход гарантирует, что твоя программа реагирует предсказуемо как на действия пользователя, так и на системные сигналы, при этом эффективно ловя стандартные ошибки времени выполнения.
Голый блок except: будет ловить исключения KeyboardInterrupt, в то время как except Exception не будет, поэтому голый except: — предпочтительный выбор, когда нужно корректно обработать прерывания пользователя.
Новый — ещё не проверен сообществом
Вы