Module (94%)
Section (86%)

Основные тезисы – Исключения

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, программа напечатает Предупреждение: введенное значение не является допустимым числом. Повторите попытку... и попросит пользователя ввести число еще раз. Что происходит в таком случае?

  1. Программа входит в цикл while.
  2. Выполняется блок try. Пользователь вводит неверное значение, например: hello!.
  3. Возникает исключение, и оставшаяся часть блока try пропускается. Программа переходит к блоку except, выполняет его, а затем продолжает работу после блока try-except.
  4. Если пользователь вводит правильное значение и никаких исключений не возникает, выполняются последующие инструкции в блоке 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("Бууу!")