Основные тезисы – Исключения
1. В Python различают два типа ошибок:
- синтаксические ошибки (ошибки анализа, англ. parsing errors), которые проявляются, когда синтаксический анализатор сталкивается с неверным выражением. Например:
Попытка выполнить следующую строку:
print("Hello, World!)
вызовет SyntaxError, и в результате на консоли отобразится следующее (или похожее) сообщение:
File "main.py", line 1 print("Hello, World!) ^ SyntaxError: EOL while scanning string literal
вывод
Обратите внимание на стрелку - она указывает на то место, где у парсера Python возникла проблема. В нашем случае это отсутствующая двойная кавычка. Заметили?
- исключения, которые возникают, даже если оператор/выражение синтаксически корректно; это ошибки, которые обнаруживаются во время выполнения, когда Ваш код приводит к ошибке, которая не является безусловно фатальной. Например:
Попытка выполнить следующую строку:
print(1/0)
вызовет исключение ZeroDivisionError, и в результате на консоли отобразится следующее (или похожее) сообщение:
Traceback (most recent call last): File "main.py", line 1, in
print(1/0) ZeroDivisionError: division by zero вывод
Обратите внимание на последнюю строку сообщения об ошибке - она действительно сообщает Вам, что произошло. Существует множество различных типов исключений, таких как ZeroDivisionError, NameError, TypeError и многие другие; и эта часть сообщения информирует Вас о том, какое исключение было вызвано. Предыдущие строки показывают контекст, в котором возникло исключение.
2. Вы можете "ловить" и обрабатывать исключения в Python с помощью блока try-except. Итак, если у Вас есть подозрение, что какой-либо конкретный кусок кода может вызвать исключение, Вы можете написать код, который будет корректно обрабатывать его и не прервет выполнение программы. Посмотрите на пример:
while True:
try:
number = int(input("Введите целое число: "))
print(number/2)
break
except:
print("Предупреждение: введенное значение не является допустимым числом. Повторите попытку...")
Приведенный выше код запрашивает у пользователя ввод, пока он не введет действительное целое число. Если пользователь вводит значение, которое не может быть преобразовано в int, программа напечатает Предупреждение: введенное значение не является допустимым числом. Повторите попытку...
и попросит пользователя ввести число еще раз. Что происходит в таком случае?
- Программа входит в цикл while.
- Выполняется блок
try
. Пользователь вводит неверное значение, например:hello!
. - Возникает исключение, и оставшаяся часть блока
try
пропускается. Программа переходит к блокуexcept
, выполняет его, а затем продолжает работу после блока try-except.
Если пользователь вводит правильное значение и никаких исключений не возникает, выполняются последующие инструкции в блоке try.
3. Вы можете обрабатывать несколько исключений в своем блоке кода. Посмотрите на следующие примеры:
while True:
try:
number = int(input("Введите целое число: "))
print(5/number)
break
except ValueError:
print("Неверное значение.")
except ZeroDivisionError:
print("Извините. Я не могу делить на ноль.")
except:
print("Я не знаю, что делать...")
Вы можете использовать несколько блоков except после одного блока try и указать конкретные имена исключений. Если выполняется одна из ветвей except
, другие ветви будут пропущены. Помните: Вы можете указать конкретное встроенное исключение только один раз. Кроме того, не забывайте, что исключение по умолчанию (или общее), то есть исключение без указанного имени, должно быть помещено в конец ветви (используйте сначала более конкретные исключения, а в последнюю очередь - более общие).
Вы также можете указать и обработать несколько встроенных исключений в одной инструкции except:
while True:
try:
number = int(input("Введите целое число: "))
print(5/number)
break
except (ValueError, ZeroDivisionError):
print("Неверное значение или нарушение правила неделения на ноль.")
except:
print("Извините, что-то пошло не так...")
4. Некоторые из наиболее полезных встроенных исключений Python: ZeroDivisionError, ValueError, TypeError, AttributeError и SyntaxError. Еще одно исключение, которое, на наш взгляд, заслуживает Вашего внимания, - это исключение KeyboardInterrupt, которое возникает, когда пользователь нажимает клавишу прерывания (CTRL-C или Delete). Запустите приведенный выше код и нажмите комбинацию клавиш, чтобы увидеть, что произойдет.
Чтобы узнать больше о встроенных исключениях Python, обратитесь к официальной документации Python.
5. И последнее, но не менее важное: Вы должны помнить о тестировании и отладке кода. Используйте такие методы отладки, как отладка print-ом; если есть возможность - попросите кого-нибудь прочитать Ваш код и помочь найти в нем ошибки или улучшить его; попытайтесь выделить проблемный и подверженный ошибкам фрагмент кода: протестируйте свои функции, используя предсказуемые значения аргументов, и попытайтесь обработать ситуации, когда кто-то вводит неправильные значения; закомментируйте части кода, которые скрывают проблему. Наконец, делайте перерывы и через некоторое время возвращайтесь к своему коду со свежим взглядом.
Упражнение
Что выведет следующая программа, если пользователь введет 0
?
try:
value = int(input("Введите число: "))
print(value/value)
except ValueError:
print("Неправильный ввод...")
except ZeroDivisionError:
print("Очень неправильный ввод...")
except:
print("Бууу!")