Исключение подтверждает правило
Давайте перепишем код, чтобы применить подход Python к жизни:
try:
value = int(input('Enter a natural number: '))
print('The reciprocal of', value, 'is', 1/value)
except:
print('I do not know what to do with', value)
Подведем итог тому, о чем мы говорили:
- любая часть кода, помещенная между
try
иexcept
, выполняется особым образом - любая ошибка, возникающая здесь, не прерывает выполнение программы. Вместо этого элемент управления немедленно перейдет к первой строке, расположенной после ключевого словаexcept
, и никакая другая часть ветвиtry
не будет выполнена; - код в ветви
except
активируется только тогда, когда в блокеtry
обнаружено исключение. Другими способами добраться туда невозможно; - когда блок
try
или блокexcept
выполняется успешно, элемент управления возвращается к обычному пути выполнения, и любой код, расположенный за пределами исходного файла, будет выполнен, как ни в чем не бывало.
Теперь мы хотим задать Вам невинный вопрос: является ли ValueError
единственным способом попадания элемента управления в ветвь except
?
Внимательно проанализируйте код и продумайте свой ответ!
Как справиться с более чем одним исключением
Да, Вы правы - деление, помещенное внутри вызова функции print()
, вызовет ZeroDivisionError
. Как и следовало ожидать, поведение кода будет таким же, как и в предыдущем случае - пользователь увидит сообщение "I do not know what to do...", что кажется вполне разумным этом контексте, но также возможно, что Вы захотите решить эту проблему немного по-другому.
Является ли это возможным? Конечно. Здесь Вы можете реализовать как минимум два подхода.
Первый из них одновременно прост и сложен: Вы можете просто добавить два отдельных блока try, один из которых включает вызов функции input()
, где может вызываться ValueError
, а второй посвящен решению возможных проблем, вызванных делением. Оба этих блока try будут иметь свои собственные ветви except
, и, по сути, Вы получите полный контроль над двумя разными ошибками.
Это хорошее решение, но оно немного длинновато - код излишне раздувается. Более того, это не единственная опасность, которая Вас поджидает. Обратите внимание, что оставление первого блока try-except
оставляет много неопределенностей - Вам придется добавить дополнительный код, чтобы гарантировать, что значение, введенное пользователем, безопасно для использования при делении. Вот как кажущееся простым решение становится чрезмерно сложным.
К счастью, Python предлагает более простой способ справиться с подобными проблемами.