Те части программы на языке Python, в которых возможно появление ошибок, например работающие с пользовательским вводом, разрешается заключать в специальные блоки try-except, с помощью которых можно обрабатывать «исключительные ситуации». Инструкции, которые способны вызвать ошибки при выполнении, группируются в блок try, а те команды, которым предстоит обрабатывать эти ошибки, — в последующий блок except. После него может стоять необязательный блок finally, где содержатся инструкции, выполняющиеся после того, как все исключения будут обработаны.
В языке Python встречается много различных типов встроенных исключений, таких как, например, NameError, которые происходят, если имя переменной не найдено; исключение IndexError, вызываемое при попытке обращения к несуществующему индексу элемента списка; а также ValueError, которое появляется, когда во встроенную операцию или
функцию передается аргумент, имеющий несоответствующее значение.
Каждое исключение возвращает сообщение с описательной информацией, которое можно использовать, присвоив его какой-нибудь переменной с помощью ключевого слова as, чтобы отобразить природу происхождения этого исключения.
Пример:
title = 'Какой-то заголовок'
try:
print(titel)
except NameError as msg:
print(msg)
#Результат выполнения: name 'titel' is not defined
Рассмотрим пример закрытия приложения при возникновении исключения. Для этого нам нужны 2 скрипта, с обработкой исключения и без.
Скрипт без обработки исключения:
while True:
inp = input("Введите число или 'q' для выхода: ")
if inp == 'q':
break
inp = float(inp)
print(inp / 2)
Скрипт с обработкой исключения:
while True:
inp = input("Введите число или 'q' для выхода: ")
if inp == 'q':
break
try:
inp = float(inp)
except ValueError:
print("Ошибка ввода!")
else:
print(inp / 2)
bat-файлы для запуска этих приложений:
run_python_exception.bat
C:\Users\1\AppData\Local\Programs\Python\Python35-32\python.exe python_exception.py %*
run_python_exception_safe.bat
C:\Users\1\AppData\Local\Programs\Python\Python35-32\python.exe python_exception_safe.py %*
Если запустить скрипт без обработки исключения, то при возникновении исключения (в данном случае при вводе буквенных значений) приложение закроется. А скрипт, обрабатывающий исключение не закроется. Такое поведение приложения является более дружелюбным по отношению к пользователю.
Можно обрабатывать множественные исключения, для этого внутри блока except в скобках нужно указать через запятую типы этих исключений:
except (NameError, IndexError) as msg:
print(msg)
Вы можете также создавать пользовательские типы исключений. Для этого используется ключевое слово raise, после которого указывается тип исключения и описательное сообщение, придуманное пользователем.
day = 32
try:
if day > 31:
raise ValueError('Неправильный номер дня')
# Сюда добавляем операторы.
except ValueError as msg:
print('Программа нашла ошибку:' , msg)
finally:
print('Конец обработки исключений.')
"""
Результат выполнения:
Программа нашла ошибку: Неправильный номер дня
Конец обработки исключений.
"""