Это руководство познакомит вас с тем, что такое исключения Python, с
наиболее распространенными типами исключений и с тем, как обрабатывать
возникшие исключения с помощью предложений try
и except
.
Что такое исключение Python?
Исключение Python - это конструкция, используемая для сигнализации о
важном событии, обычно об ошибке, которое происходит при выполнении
программы. Исключение может привести к остановке программы, если она не
будет должным образом «поймана» (т.е. обработана правильно). Если вы
думаете, что ваша программа может вызвать исключение при выполнении, вам
будет полезно использовать try/except
для их обработки, что мы увидим
в следующем разделе.
Обработка исключений
В приведенном ниже примере мы предлагаем пользователю ввести число, и после выполнения программа выдает значение данного числа в квадрате. Программа будет работать, пока вы вводите число.
while True:
x = int(raw_input("Please enter a number: "))
print("%s squared is %s" % (x, x**2))
Когда вы вводите строку или любой другой символ, не являющийся числом, например «один», программа вызовет исключение «Ошибка значения», как показано ниже:
$ python squared.py
Please enter a number: 3
3 squared is 9
Please enter a number: 4
4 squared is 16
Please enter a number: five
Traceback (most recent call last):
File "squared.py", line 4, in <module>
x = int(raw_input("Please enter a number: "))
ValueError: invalid literal for int() with base 10: 'five'
Здесь и появляется обработка исключений. Вам нужно знать, как правильно обрабатывать исключения, особенно в производственных средах, потому что, если они не обрабатываются, ваша программа не будет знать, что делать, и выйдет из строя.
Давайте посмотрим, как мы можем справиться с вышеуказанной ошибкой. Это
делается путем окружения программы, которая, по вашему мнению, может
вызвать исключение, try
и сопоставления ее со следующим except
для
выполнения в случае возникновения исключения.
Давайте перепишем ту же программу и на этот раз позаботимся обо всех возможных исключениях.
while True:
try:
x = int(raw_input("Please enter a number: "))
print("%s squared is %s" % (x, x**2))
except ValueError:
print("Please enter a valid number!")
Как видно из приведенной выше программы, сначала выполняется try
Если
ошибки не возникает, выполняется остальная часть кода, а except
пропускается.
В случае возникновения исключения (например, при вводе строки вместо
числа) программа выполняет except
который соответствует его try
,
после чего следует остальная часть кода за пределами блока try/except
, если таковой имеется.
Посмотрите, что происходит, когда мы запускаем наш код с операторами
try/except
$ python safe_squared.py
Please enter a number: 3
3 squared is 9
Please enter a number: 4
4 squared is 16
Please enter a number: five
Please enter a valid number!
Please enter a number: 5
5 squared is 25
Примечание . Имейте в виду, что предложение except
будет
обрабатывать исключения только из соответствующего try
, даже если
имеется несколько обработчиков предложений try/except
Типы исключений в Python
Python имеет несколько встроенных исключений. Давайте взглянем на некоторые из наиболее распространенных исключений, чтобы вы могли понять, что это такое и как их использовать.
KeyError Exception
Это ошибка, возникающая при использовании словаря при попытке получить ключ, которого нет в словаре.
Ниже приведено представление Django, используемое для аутентификации пользователей, и оно ожидает получить словарь, содержащий ключи «имя пользователя» и «пароль». Если какой-либо из ключей не передан в данных, программа вызовет исключение Key Error.
def authenticate_user(request):
try:
email = request.data['username']
password = request.data['password']
user = authenticate(email=email, password=password)
if user and user.is_active:
return Response(user_details,status=HTTP_200_OK)
else:
res = {'error': 'can not authenticate with the given credentials'}
return Response(res, status=status.HTTP_400_BAD_REQUEST)
except KeyError:
res = {'error': 'please provide a username and a password'}
Используя try/except
для перехвата исключения, наш пользователь увидит
ошибку вместо сбоя нашего сервера.
Исключение IndentationError
Этот вид исключения возникает, когда ваш код имеет неправильный отступ. Вместо использования фигурных скобок для указания области действия Python использует отступы, поэтому важно получить правильный отступ, что и является целью этого исключения.
Напишем функцию, которая проверяет четность числа:
def is_even(number):
if number % 2 == 0:
print(" %s is an even number" % (number))
else:
print("%s is an odd number" % (number))
print(is_even(1))
print(is_even(2))
Функция приведет к ошибке отступа в строках 2 и 4, поскольку ожидает, что код будет иметь отступ с 8 пробелами, а не с 4.
Если вы запустите программу, она выдаст следующий результат:
$ python is_even.py
File "is_even.py", line 3
print(" %s is an even number" % (number))
^
IndentationError: expected an indented block
SyntaxError Exception
Это один из наиболее распространенных типов исключений в Python. Это происходит, когда есть ошибка в синтаксисе вашего кода.
Давайте посмотрим на пример ниже:
def is_odd(n):
if n % 2 != 0:
print(it's odd)
else:
print("not odd")
print(is_odd(7))
Результатом этого кода будет недопустимый синтаксис в строке 3, потому что строка «это нечетно» не заключена в кавычки.
$ python is_odd.py
File "is_odd.py", line 3
print(it's odd)
^
SyntaxError: EOL while scanning string literal
Имейте в виду, что существует много разных типов синтаксических ошибок, и это только один пример.
Исключение TypeError
Это исключение возникает при попытке выполнить операцию или функцию,
недопустимую для указанного типа данных. В приведенном ниже примере
функция sum_of_numbers
принимает 2 аргумента и складывает их. Когда вы
пытаетесь вызвать функцию с 3 аргументами, она вызывает исключение
TypeError, поскольку ожидает только 2 аргумента.
def sum_of_numbers(a, b):
return a + b
print(sum_of_numbers(1, 2, 7))
Выполнение этого кода дает следующий результат:
$ python sum_of_numbers.py
Traceback (most recent call last):
File "sum_of_numbers.py", line 4, in <module>
print(sum_of_numbers(1, 2, 7))
TypeError: sum_of_numbers() takes exactly 2 arguments (3 given)
Пункты try / except, else и finally
Есть несколько других компонентов обработки исключений, и это
предложения else
и finally
.
Мы уже могли использовать операторы try и catch, которые используются
для обнаружения ошибок. Давайте теперь также посмотрим на операторы
else
и finally
Пункт else
Еще пункт используется для выполнения кода , когда программа не
вызывает исключение. Также лучше использовать предложение else, чем
добавлять дополнительный код в предложение try
. Это связано с тем,
что он позволяет избежать непреднамеренного перехвата исключения,
которое не было вызвано кодом, защищенным операторами try/except
.
Рассмотрим пример, который мы использовали в начале этого руководства,
но вместо этого мы собираемся выполнить оператор print
внутри
оператора else
while True:
try:
x = int(raw_input("Please enter a number: "))
except ValueError:
print("Please enter a valid number!")
else:
print("%s squared is %s" % (x, x**2))
Выполнение этого кода обеспечивает ту же функциональность, что и раньше,
за исключением того, что он изолирует подверженный ошибкам код
int(raw_input(...))
try
и «безопасный» код в операторе else
$ python else_squared.py
Please enter a number: 3
3 squared is 9
Please enter a number: 4
4 squared is 16
Please enter a number: five
Please enter a valid number!
Please enter a number: 5
5 squared is 25
Окончательная оговорка
Это предложение предназначено для определения действий по очистке, которые должны выполняться независимо от того, было вызвано исключение или нет.
Предложение finally
всегда должно выполняться перед выходом из
try/except
, независимо от того, произошло ли исключение. Обычно это
используется для очистки, например, для закрытия открытого файла.
Давайте включим в наш пример предложение finally
count = 0
while True:
try:
x = int(raw_input("Please enter a number: "))
except ValueError:
print("Please enter a valid number!")
else:
print("%s squared is %s" % (x, x**2))
finally:
print("Ran %s time(s)" % count)
Выполнение этого кода аналогично предыдущему, за исключением того, что теперь мы можем видеть, сколько раз выполнялся наш цикл, независимо от того, было ли возбуждено исключение или нет:
$ python finally_squared.py
Please enter a number: 3
3 squared is 9
Ran 1 time(s)
Please enter a number: 4
4 squared is 16
Ran 2 time(s)
Please enter a number: five
Please enter a valid number!
Ran 3 time(s)
Please enter a number: 5
5 squared is 25
Ran 4 time(s)
Заключение
В этом руководстве мы кратко объяснили, как обрабатывать исключения в
Python с помощью try/except
, включая некоторые из дополнительных
компонентов, else
и finally
. Я надеюсь, что это руководство
устранило вашу путаницу с исключениями Python.
Если вы хотите узнать больше, вы можете найти дополнительную информацию в разделе « Ошибки и исключения » документации Python.