Документация по Python. Теоретические материалы, и практические задачи

Python обработка исключений

В 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()

Данный тип конструкции дает нам гарантию что открытый файл будет закрыт правильно, даже если произойдет непредвиденное исключение.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *