В Python обработка исключений как и в других языка программирования, является важной частью разработки программ. О том какие исключения, и какие бывают коды ошибок можно почитать в статье коды ошибок Python. Сегодня мы познакомимся с операторами try, except, finally на примерах.
Исключения в Python
В ходе работы вашей программы, может возникнуть неожиданная ошибка, при возникновении ошибки, Python остановит работу вашей программы, если данная ошибка не обработана. Рассмотрим пример. Допустим в нашей программе есть функция A, в которой вызывается функция B, которая в свою очередь вызывает функцию C.
В ходе работы нашей программы, происходит необработанное исключение в функции C, данное исключение передается функции B, если она и там не обработана, передается в функцию А. Если исключение не обрабатывается нигде, интерпретатор Python, останавливает работу программы, и вызывается код ошибки, относящийся к данному исключению. Конечно, мы можем написать программу без обработки исключений, и программа будет работать, правда это будет продолжаться до первой ошибки.
Перехват исключений Python
Структура обработки исключений довольно простая. Код который имеет вероятность вызова исключений, помещается внутри оператора try, а код для обработки помещается внутри except. Такая иерархия позволяет нам выбирать операцию, которую нужно сделать после отлова исключения. Рассмотрим пример:
import sys
rlist= ['b', 0, 2]
for i in rlist:
try:
print("Текущий элемент", i)
r = 1 / int(i)
break
except:
print("Ошибка", sys.exc_info()[0] )
print("Следующий элемент")
print()
print("Результат операции  с", i , "равен", r )
Результат:
Текущий элемент b
Ошибка <class 'ValueError'>
Следующий элемент
Текущий элемент 0
Ошибка <class 'ZeroDivisionError'>
Следующий элемент
Текущий элемент 2
Результат операции с 2 равен 0.5
В этой программе, мы циклом for , перебираем значения в списке rlist. Возможный проблемный код мы помещаем в блок try, если исключение не происходит, то блок except пропускается, и код продолжает работу. Если же возникает исключение, то он перехватывается блоком except. В данном случае, мы печатаем имя исключения с помощью функции exc_info(), который находится внутри модуля sys. В первом случае, блок except перехватывает первый элемент, и сообщает нам об ошибке ValueError, во втором он перехватывает значение 0, и сообщает нам об ошибке ZeroDivisionError.
Благодаря обработке исключений, мы можем себе гарантировать, что наша программа не словит ошибку, и не перестанет работать. В выше описанной программе, при первом же обходе списка, без обработки исключений, наша программа остановила бы свою работу. Каждое исключение в Python наследуется от стандартного класса Exception, вышеописанную программу, мы так же можем выполнить следующим образом:
import sys
rlist=['b', 0, 2]
for i in rlist:
try:
print("Текущий элемент", i)
r = 1 / int(i)
break
except Exception as e:
print("Ошибка", e.__class__ )
print("Следующий элемент")
print()
print("Результат операции с", i , "равен", r )
Результат:
Текущий элемент b
Ошибка <class 'ValueError'>
Следующий элемент
Текущий элемент 0
Ошибка <class 'ZeroDivisionError'>
Следующий элемент
Текущий элемент 2
Результат операции с 2 равен 0.5
Как видите, эта программа имеет тот же результат.
Перехват определенных исключений в Python
В приведенных выше примерах, мы отловили исключения, но мы не затронули тему отлова конкретных исключений. Вышеописанный код не является хорошим, так как одним except мы обрабатываем все исключения. В одном блоке try: мы можем поместить неограниченное количество блоков except, где мы можем обрабатывать конкретные исключения. Так же, в блоке except, мы можем указать кортеж исключений. Рассмотрим небольшой блок:
try: pass except ValueError: #Обработка исключений ValueError pass except (TypeError, ZeroDivisionError) #Пример обработки нескольких исключений pass except: #Обработка всех исключений pass
Блоки try…finally
В статье про файловые операции мы с вами познакомились с блоками try…finally. Для гарантированного закрытия файла, мы использовали следующий блок кода:
try:
file = open("text.txt", encoding= 'utf-8')
finally:
file.close()
Данный тип конструкции дает нам гарантию что открытый файл будет закрыт правильно, даже если произойдет непредвиденное исключение.



