Статьи

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

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

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

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

1
2
3
4
5
keep_asking = True
 
while keep_asking:
    x = int(input(«Enter a number: «))
    print(«Dividing 50 by», x,»will give you :», 50/x)

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

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

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

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

Как и имена выше, большинство исключений имеют понятные имена.

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

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

1
2
3
4
5
6
7
8
keep_asking = True
 
while keep_asking:
    try:
        x = int(input(«Please enter a number: «))
        print(«Dividing 50 by», x,»will give you :», 50/x)
    except ValueError:
        print(«The input was not an integer. Please try again…»)

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

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

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

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

1
2
3
except (ZeroDivisionError, ValueError, TypeError):
   print(«Something has gone wrong..»)
   # code to deal with the exception

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

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

1
2
3
4
5
6
7
8
9
import math
import sys
 
try:
    result = math.factorial(2.4)
except:
    print(«Something Unexpected has happened.»,sys.exc_info()[0])
else:
    print(«The factorial is», result)

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

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

1
2
3
4
5
6
7
8
9
keep_asking = True
 
while keep_asking:
    try:
        x = int(input(«Please enter a number: «))
    except ValueError:
        print(«The input was not a valid integer. Please try again…»)
    else:
        print(«Dividing 50 by», x,»will give you :», 50/x)

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

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

01
02
03
04
05
06
07
08
09
10
11
keep_asking = True
 
while keep_asking:
    try:
        x = int(input(«Please enter a number: «))
    except ValueError:
        print(«The input was not a valid integer. Please try again…»)
    else:
        print(«Dividing 50 by», x,»will give you :», 50/x)
    finally:
        print(«Already did everything necessary.»)

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import math
 
number_list = [10,-5,1.2,’apple’]
 
for number in number_list:
    try:
        number_factorial = math.factorial(number)
    except TypeError:
        print(«Factorial is not supported for given input type.»)
    except ValueError:
        print(«Factorial only accepts positive integer values.», number,» is not a positive integer.»)
    else:
        print(«The factorial of»,number,»is», number_factorial)
    finally:
        print(«Release any resources in use.»)

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

01
02
03
04
05
06
07
08
09
10
11
The factorial of 10 is 3628800
Releasing any resources in use.
 
Factorial only accepts positive integer values.
Releasing any resources in use.
 
Factorial only accepts positive integer values.
Releasing any resources in use.
 
Factorial is not supported for given input type.
Releasing any resources in use.

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

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

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

Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.