Python: уроки, справочник и задачи

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

Раздел: Исключения и отладка · Обновлено 31.10.2026

В Python обработка исключений как и в других языка программирования, является важной частью разработки программ. О том какие исключения, и какие бывают коды ошибок можно почитать в статье коды ошибок Python. Сегодня мы познакомимся с операторами try, except, finally на примерах.

Python обработка исключений
Фото: Silar / CC BY-SA 4.0, Wikimedia Commons
Содержание статьи
  1. Исключения в Python
  2. Перехват исключений Python
  3. Перехват определенных исключений в Python
  4. Блоки try...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()

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