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

Это руководство познакомит вас с тем, что такое исключения Python, с наиболее распространенными типами исключений и с тем, как обрабатывать возникшие исключения с помощью предложений try и except. Что такое исключение Python? Исключение Python - это конструкция, используемая для сигнализации о важном событии, обычно об ошибке, которое происходит при выполнении программы. Исключение может привести к остановке программы, если она не будет должным образом «поймана» (т.е. обработана правильно). Если вы думаете, что ваша программа может вызвать исключение при выполнении

Это руководство познакомит вас с тем, что такое исключения 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.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus