Короткий ответ
Голый except перехватывает абсолютно все исключения, включая KeyboardInterrupt, SystemExit и GeneratorExit, тогда как except Exception их не трогает. На практике ловят конкретные ожидаемые типы: код реагирует на разные ошибки по-разному, а посторонние сбои не маскируются.
Как это работает подробнее
Разница определяется иерархией исключений и тем, насколько широкий круг ошибок попадает в обработчик.
- Иерархия исключений. От
BaseExceptionнаследуются иException, и системныеKeyboardInterrupt,SystemExit,GeneratorExit, поэтомуexcept Exceptionих не перехватывает. - Голый except. Не сообщает, какая ошибка произошла: реальный тип скрыт, программа «проглатывает» баг, а пользователь не может прервать её по Ctrl+C.
- Порядок обработчиков. Их располагают от конкретных к общим, иначе первый общий обработчик перехватит ошибку раньше и остальные не сработают.
- Допустимый случай. Голый
exceptоправдан лишь как страховочная сетка в самом конце цепочки и при полном понимании рисков.
Пример кода
Конкретный и запасной обработчики
try:
number = int(input('Введите число: '))
except ValueError: # конкретное исключение
print('Введено не число!')
except Exception: # общий «запасной» обработчик
print('Произошла непредвиденная ошибка')
finally:
print('Готово')Что использовать на практике
- Ожидаемые ошибки. Перехватывай конкретные типы, например
except ValueErrorили кортеж(ValueError, TypeError).