Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python
Code

Как обрабатывать исключения в Python

by
Difficulty:IntermediateLength:MediumLanguages:

Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)

При выполнении программ очень часто встречаются ошибки. Два распространенных типа ошибок, с которыми вам приходится иметь дело — ошибки синтаксиса и исключения. Синтаксические ошибки возникают при неправильном наборе кода. В таких случаях строка с ошибкой повторяется парсером со стрелкой, указывающей на самое раннее место, где была обнаружена ошибка.

Исключения отличаются от синтаксических ошибок. Они возникают во время выполнения программы, когда происходит что-то неожиданное. Например, допустим, вы просите пользователя ввести число для выполнения деления.  Теперь, если пользователь вводит строку вместо числа, а вы пытаетесь разделить число на указанные данные, программа выведет TypeError.

При неправильной обработке исключения, программа прекратит работу, так как не знает, что делать в таких случаях. Следующий код, показывает такой случай:

Пока вы вводите значение в виде целого числа, программа будет работать правильно. Однако, как только вы введёте строку или даже десятичное число, вы получите исключение ValueError.

Из этого урока вы узнаете, как правильно обрабатывать и создавать исключения в Python.

Некоторые общие исключения

Вот некоторые основные исключения, которые могут возникнуть при написании программ. Вы можете прочитать о многих других встроенных исключениях на официальном сайте.

  • NameError: это исключение возникает, когда программа не может найти локальное или глобальное имя. Имя, которое не удалось найти, включено в сообщение об ошибке.
  • TypeError: это исключение возникает, когда функция передается объекту несоответствующего типа в качестве аргумента. Более подробная информация о неправильном типе содержится в сообщении об ошибке.
  • ValueError: это исключение возникает, когда аргумент функции имеет правильный тип, но недопустимое значение.
  • NotImplementedError: это исключение возникает, когда объект должен поддерживать операцию, но он ещё не реализован. Вы не должны использовать эту ошибку, если данная функция не предназначена для поддержки типа входящего аргумента. В таких ситуациях более целесообразно подбрасывать исключение TypeError.
  • ZeroDivisionError: это исключение возникает, когда вы предоставляете второй аргумент для операции деления по модулю равный ноль.
  • FileNotFoundError: это исключение возникает, когда файл или каталог, запрошенные программой, не существуют.

Так же, как и названия перечисленные выше, у большинства исключений понятные имена.

Обработка исключения

Код в начале статьи просил пользователей ввести целое число. Если пользователь не предоставлял целое число, программа прекращала работу и вызвала исключение по ошибке значения. В этом разделе мы напишем некоторый код, чтобы сообщить пользователю, что то, что он ввёл не является допустимым целым значением.

Первым шагом процесса является включение кода, который, по вашему мнению, может вызвать исключение внутри блока try. Следующий шаг — использовать ключевое слово except для обработки исключения, которое произошло в приведенном выше коде. Изменённый код для пользовательского ввода будет выглядеть так:

Здесь происходит так, что программа пытается выполнить код внутри блока try. Если исключение не возникло, программа пропускает предложение except и остальная часть кода выполняется нормально. Если возникает исключение, программа пропускает оставшийся код внутри блока try, а тип исключения сопоставляется с именем исключения после ключевого слова except. В случае совпадения, сначала выполняется код под except, а, затем, после try, остальная часть кода выполняется нормально.

Когда вы вводите целое число, программа дает окончательный результат деления. Когда предоставляется нецелое значение, программа печатает сообщение с просьбой снова ввести целое число. Обратите внимание, что на этот раз программа не прерывается, когда вы предоставляете какие-либо недопустимые данные.

У вас может быть несколько except, для обработки разных исключений. Имейте в виду, что эти обработчики будут иметь дело только с исключениями, которые произошли в соответствующем блоке try. Исключения, возникающие в других обработчиках исключений обрабатываться не будут.

Вы также можете обрабатывать несколько исключений с помощью отдельного блока except, передавая эти исключения как tuple.

Наконец, вы также можете оставить название исключения после ключевого слова except. Обычно это не рекомендуется, так как теперь код будет захватывать все исключения и обрабатывать их таким же образом. Это не оптимальный вариант, так как исключение TypeError будет обрабатываться так же, как если бы вы обработали исключение ZeroDivisionError. При обработке исключений лучше быть как можно более конкретным и отлавливать только то, что вы можете обработать.

Одно из возможных способов использования всех исключений — правильно распечатать ошибку с исключением на экране, например, вот так:

Использование else

Вы также можете использовать else в конструкции try... except. Блок else должен содержать код, который будет выполнен, если try не вызвало каких-либо исключений. Это может быть полезно для того, чтобы убедиться, что вы не добавили код в блок try, исключения которого вы не собираетесь отлавливать. Следует упомянуть одно: если вы решите использовать else, вы должны включить его после всех except, но до блока finally.

В нашем случае мы могли бы переместить строку, которая напечатает результат нашего деления внутрь блока else.

Очистка с помощью finally

Допустим, вы написали код в блоке try, который должен выполнять задачу, используя большой объем ресурсов. Важно вернуть эти ресурсы, когда вы закончите их использовать. Достичь это можно, используя finally.

Код внутри finally всегда выполняется независимо от того, вызвал ли блок try исключение. Вы можете проверить это, выполнив следующий код:

Если какое-либо из описанных вами except не обрабатывает вызванное исключение, то такое же исключение снова возникнет после выполнения кода в блоке finally.

Более сложный пример

В этом разделе мы напишем программу для обработки нескольких исключений. Как и в предыдущих примерах, мы выполним некоторые математические операции. Однако на этот раз мы возьмем данные из списка.

Следующий код проверяет два исключения: TypeError и ValueError. Блок else используется для вывода факториала. Вы можете видеть на выходе, что этот код выполняется только тогда, когда исключение не выбрасывается.

Вышеприведенный код выводит следующий результат:

Ещё одна вещь, заслуживающая внимания, заключается в том, что код внутри finally выполняется для каждого элемента в списке.

Заключительные мысли

Надеюсь, этот урок поможет вам понять обработку исключений в Python. Кроме того, не стесняйтесь посмотреть, что у нас есть на продажу и для изучения на рынке, и не стесняйтесь задавать любые вопросы и предоставлять ценную обратную связь, используя приведенный ниже канал.

Правильное использование исключений может быть очень полезно в ситуациях, когда выход из программы после получения неожиданного ввода не является корректным. Если у вас есть вопросы, связанные с обработкой исключений в Python, пожалуйста, дайте мне знать в комментариях.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.