Module (82%)
Section (29%)

Исключение подтверждает правило

Давайте перепишем код, чтобы применить подход 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 предлагает более простой способ справиться с подобными проблемами.