Исключения в Python это некоторая сущность, с которой можно осуществлять следующие действия: их можно выбрасывать и их можно ловить. Исключениями можно пользоваться только для обработки ошибок. У исключения есть имя для того, чтобы можно было различать возникающие нештатные ситуации.

Надо понимать, что наличие исключений является абсолютно необходимым при переходе к объектно-ориентированным языкам, т.к. идеология работы с ошибками через коды ошибок (как в языке C) уже не вписывается в возможности объектно-ориентированного языка.

Работа исключениями сводится к тому, что в момент появления какой-то ошибки (в каком-то смысле) должно происходить выбрасывание исключения. После этого очередные операторы программы выполняться не будут (в этом и есть смысл исключения), а вместо этого следующим выполняется блок, который назначается для выполнения при поимке исключения. Отметим, что этот блок должен выполняться только при поимке исключения и не будет выполняться в случае нормальной работы программы. Пример:

try:

    f=open("inn.txt","r")

    #...

    f.close()

except FileNotFoundError:

    print("can't open file")

 

Здесь мы создали блок для ловли исключения с именем FileNotFoundError с помощью операторов try и except. Таким образом, если не удастся открыть файл (т.е. функция open не сможет штатно отработать и выбросит исключение), то операторы после нее не будут выполняться, а вместо них управление будет передано блоку после оператора except.

 

Выбрасывать исключения можно самостоятельно с помощью команды raise. Например, если перед попыткой открыть файл Вы обнаружили, что имя файла Вас по каким-то причинам не устраивает, то вы можете заранее сказать, что файл не удастся открыть командой

raise FileNotFoundError

Ловить можно сразу несколько исключений. В этом случае их имена перечисляются через запятую и все вместе заключаются в круглые скобки.

Если для различных исключений требуются различные обработчики, то после инструкции и блока except можно вставить еще одну инструкцию и блок except. После блоков except можно вставлять аналогичные инструкции и блоки else и finally. Блок else выполняется в случае, если исключений не произошло. Блок finally выполняется в любом случае.

Приведем пример функции, подсчитывающей сумму значений 1/x для всех значений x, записанных в файле (числа должны быть по одному в строке; деление на ноль должно игнорироваться):

try:

f=open("in.txt","r")

    sum=0

    for s in f:

        try:

            x=1/float(s)

        except  ValueError:

                print("bad value in the string '",s,"'",sep="")

        except  ZeroDivisionError:

                print("bad zero value")

        else:

                sum+=x

except FileNotFoundError:

    print("can't open file")

else:

    f.close()

    print("sum=",sum,sep="")

finally:

    print("Done")