В 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("Результат операции&nbsp; с", 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()
Данный тип конструкции дает нам гарантию что открытый файл будет закрыт правильно, даже если произойдет непредвиденное исключение.