В этом руководстве мы рассмотрим как используется и для чего нужны исключения (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. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их в комментариях.





![[Решение] Как избежать ошибки UnboundLocalError](https://egorovegor.ru/wp-content/uploads/5b77c575d7-335x220.webp)




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