Исключения (exception) в Python

Исключения (exception) в Python

В этом руководстве мы рассмотрим как используется и для чего нужны исключения (exception) в Python. Так же рассмотрим как использовать конструкцию try-except.

Введение

Для управления ошибками, которые появляются в программе, Python использует особые объекты, называемые исключениями (exceptions).

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

Примеры вызова exception

Рассмотрим популярные примеры вызов исключений.

Получение доступа к индексу за пределами списка

num = [33,34, 35, 36]
num[7]

IndexError: list index out of range

Конвертирование неподходящего типа

dict(num)

TypeError: cannot convert dictionary update sequence element #0 to a sequence

Обращение к несуществующей переменной

print(city)

NameError: name 'city' is not defined

Смешивание типов без преобразования

a = 'test string'
a + 10

TypeError: can only concatenate str (not "int") to str

Типы исключений

  • SyntaxError — Ошибка в синтаксисе программы
  • NameError — Ошибка обращения к несуществующей переменной
  • AttributeError — Ссылка на атрибут не работает
  • TypeError — Операнд не имеет правильного типа
  • ValueError — Неверный тип у значения переменной
  • IOError — Ошибка в подсистеме системе ввода вывода
  • ZeroDivisionError — Ошибка деления на ноль

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

first = int(input("Напишите любое целое число: "))
second = int(input("Введите еще одно число: "))

print(first/second)

Этот пример кода выполняет деление одного числа на другое. Чтобы продемонстрировать ошибку, предположим что пользователь вводит 10 и 0 в качестве первого и второго чисел соответственно, Python на это возбуждает исключение ZeroDivisionError:

Напишите любое целое число: 10
Введите еще одно число: 0

ZeroDivisionError: division by zero

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

Язык имеет встроенную конструкцию для работы с исключениями. Обработка происходит с помощью блока try-except.

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

try:
     first = int(input("Напишите любое целое число: "))
     second = int(input("Введите еще одно число: "))
     print(first/second)
except:
     print("Ошибка ввода данных")

Давайте введем тот же набор данных что и посмотрим что будет

Напишите любое целое число: 10
Введите еще одно число: 0
Ошибка ввода данных

Ввод строки вместо числа

Напишите любое целое число: 10
Введите еще одно число: ноль
Ошибка ввода данных

В предыдущем примере деление на 0 приводило к исключению ZeroDivisionError, но когда ввели строковое значение переменной и попробовали на него разделить число сработало новое исключение ValueError.

Проверка с корректным вводом.

Напишите любое целое число: 6
Введите еще одно число:  2
3

В этом примере не происходит вызова исключений т.к данные введены и обработаны корректно.

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

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

В нашем случае можно поймать и обработать исключение ZeroDivisionError.

try:
     first = int(input("Напишите любое целое число: "))
     second = int(input("Введите еще одно число: "))
     print(first/second)
except ZeroDivisionError:
     print("Разделить число на ноль - невозможно!")

Попробуем разделить на ноль и посмотрим результат

Напишите любое целое число: 4
Введите еще одно число: 0

Разделить число на ноль - невозможно!

А что будет если ввести строку?

Напишите любое целое число: 4
Введите еще одно число: один

ValueError: invalid literal for int() with base 10: 'один'

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

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

Конструкция обработки исключений дает возможность обрабатывать каждый тип ошибки отдельно, пример ниже дополнительно обрабатывает ошибку ValueError

try:
     first = int(input("Напишите любое целое число: "))
     second = int(input("Введите еще одно число: "))
     print(first/second)
except ZeroDivisionError:
     print("Разделить число на ноль - невозможно!")
except ValueError:
     print("Неправильный тип переменной")

Использование оператора finally

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

try:
     first = int(input("Напишите любое целое число: "))
     second = int(input("Введите еще одно число: "))
     print(first/second)
except ZeroDivisionError:
     print("Разделить число на ноль - невозможно!")
except ValueError:
     print("Неправильный тип переменной")
finally:
     print("Работа программы завершена")

В реальных приложениях, выражение finally полезно для освобождения внешних ресурсов (таких, как файлы или сетевые соединения), независимо от того, было ли использование ресурса успешным.

Заключение

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

Егор Егоров

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

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Майя

    Добрый день! Мне надо ввести числа из конкретного диапазона: 0<n<10. Как написать исключение для остальных?

    Ответить