В этом руководстве мы рассмотрим как используется и для чего нужны исключения (exception) в Python. Так же рассмотрим как использовать конструкцию try-except.
- Введение
- Примеры вызова exception
- Получение доступа к индексу за пределами списка
- Конвертирование неподходящего типа
- Обращение к несуществующей переменной
- Смешивание типов без преобразования
- Типы исключений
- Обработка всех исключений
- Обработка конкретных исключений
- Обработка нескольких исключений
- Использование оператора finally
- Заключение
Введение
Для управления ошибками, которые появляются в программе, 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. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их в комментариях.
Добрый день! Мне надо ввести числа из конкретного диапазона: 0<n<10. Как написать исключение для остальных?