Как обрабатывать исключения в Python

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

Что такое исключения в Python?

Исключение – это нежелательное событие/ошибка в программе, которая нарушает ход выполнения кода и останавливает программу. Но если исключение обрабатывается самой программой, то она продолжает работу. 

В Python есть несколько предопределенных исключений. Мы также можем объявлять пользовательские исключения. Для этого создаются классы, наследующие класс Exception, а затем с помощью ключевого слова raise создаются сами исключения.

В следующей программе мы создаем словарь и пытаемся получить доступ к значениям по ключам. Но поскольку в словаре нет ключа “c”, во втором операторе print возникает ошибка. Наткнувшись на ошибку, программа прекратит выполнение.

# Создать словарь
myDict={"a":1,"b":2}

# Эта строка выведет значение
print(myDict["a"])

# Эта строка сгенерирует исключение KeyError exception, после чего программа завершится
print(myDict["c"])

Вывод:

1
Traceback (most recent call last):
  File "/home/marina/PycharmProjects/new_python3/Editing.py", line 8, in <module>
    print(myDict["c"])
KeyError: 'c'

В приведенном выше коде мы видим, что программа вывела единицу, сообщила, что произошла ошибка KeyError, и завершила свое выполнение. Мы можем обработать эту ошибку и сгенерировать пользовательский вывод с помощью блоков try и except.

Как обрабатывать исключения в Python?

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

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

Давайте реализуем программу из предыдущего примера, используя блоки try и except, чтобы при возникновении ошибки программа завершилась нормально.

try:
    # Создать словарь
    myDict={"a": 1,"b": 2}
    # Эта строка выведет значение
    print(myDict["a"])
    # Эта строка сгенерирует исключение KeyError, и программа выйдет из блока try
    print(myDict["c"])
except:
    print("Error Occurred in Program. Terminating.")

Вывод:

1
Error Occurred in Program. Terminating.

Мы видим, что программа не вылетает аварийно. После возникновения ошибки она выполняет инструкции в блоке except, а затем завершается.

Здесь необходимо помнить, что инструкции в блоке try после момента, когда произошло исключение, не будут выполнены.

Обработка исключений по отдельности

Чтобы обрабатывать каждое исключение по отдельности, можно передавать аргументы в блоки исключений. При генерации исключения, тип которого совпадает с типом аргумента, будет выполнен код в соответствующем блоке.

В следующем сниппете кода исключение KeyError мы обработаем отдельно, а остальные исключения будут обработаны обычным блоком except.

try:
    # Создать словарь
    myDict = {"a": 1, "b": 2}
    # Эта строка выведет значение
    print(myDict["a"])
    # Эта строка сгенерирует исключение NameError, и программа выйдет из блока try
    print(a)
except(KeyError):
    print("Key is not present in the dictionary. proceeding ahead")
except:
    print("Error occured. Proceeding ahead")

try:
    # Создать словарь
    myDict = {"a": 1, "b": 2}
    # Эта строка выведет значение
    print(myDict["a"])
    # Эта строка сгенерирует исключение KeyError, и программа выйдет из блока try
    print(myDict["c"])
except(KeyError):
    print("Key is not present in the dictionary. Terminating the program")
except:
    print("Error occured. Terminating")

Вывод:

1
Error occured. Proceeding ahead
1
Key is not present in the dictionary. Terminating the program

Мы видим, что исключение KeyError было обработано отдельно благодаря его передаче в блок except в качестве параметра. При этом остальные исключения обрабатываются обычным образом.

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

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

В программах, где выполняется обработка файлов или используются сетевые соединения, необходимо, чтобы программа завершала соединения или закрывала файл перед завершением.

Блок finally размещается после блоков try и except.

try:
    # Создать словарь
    myDict = {"a": 1, "b": 2}
    # Эта строка выведет значение
    print(myDict["a"])
    # Эта строка сгенерирует исключение KeyError, и программа выйдет из блока try
    print(myDict["c"])
except(KeyError):
    print("Key is not present in the dictionary. Proceeding ahead")
finally:
    print("This is the compulsory part kept in finally block and will always be executed.")

Вывод:

1
Key is not present in the dictionary. Proceeding ahead
This is the compulsory part kept in finally block and will always be executed.

Как видите, блок try вызвал исключение. Оно было обработано блоком except. После этого, наконец, выполняется блок finally.

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

Вместе с блоками try и except также можно использовать блок else. Он применяется, когда нам нужно выполнить определенные инструкции после успешного выполнения кода в блоке try.

Блок else записывается после блоков try и except. Только не забудьте, что ошибки/исключения, сгенерированные в блоке else, не обрабатываются инструкциями в блоке except.

try:
    # Создать словать
    myDict={"a":1,"b":2}
    # Эта строка выведет значение
    print(myDict["a"])
except:
    print("I am in except block and will get executed when an exception occurs in try block")
else:
    print("I am in else block and will get executed every time after try block is executed successfully.")

Вывод:

1
I am in else block and will get executed every time after try block is executed successfully.

Код в блоке else выполнился после успешного выполнения блока try. Если блок try вызовет исключение, то будет выполнен только блок except.

То есть, если блок try генерирует исключение, то код в блоке else не выполняется.

Как генерировать определенные пользователем исключения в Python?

Используя обработку исключений, можно наложить ограничения на некоторые значения.

Чтобы сгенерировать определенное пользователем исключение, мы используем ключевое слово raise при выполнении определенного условия. Затем исключение обрабатывается блоком except в коде.

Чтобы создать определенное пользователем исключение, мы создаем класс с желаемым именем исключения, который должен наследовать класс Exception. После этого мы можем вызывать это исключение в любом месте нашего кода.

# Создать класс исключения
class SmallNumberException(Exception):
    pass


try:
    # Создать словарь
    myDict = {"a": 1, "b": 2}
    # Эта строка поднимет SmallNumberException
    if (myDict["a"] < 10):
        raise SmallNumberException
except(SmallNumberException):
    print("The Number is smaller than 10")

Вывод:

The Number is smaller than 10

В этом сниппете кода было создано определяемое пользователем исключение. Оно наследует класс Exception. Это исключение поднимается после условного оператора для проверки того, меньше ли число 10.

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

Заключение

В этой статье мы рассмотрели обработку исключений в Python. Мы разобрались, как реализовать блоки try, except, finally и else при обработке исключений. Кроме того, мы рассказали, как создавать пользовательские исключения для реализации ограничений на переменные.

Перевод статьи Aditya Raj «Exception Handling in Python: Writing a Robust Python Program».

5 комментариев к “Как обрабатывать исключения в Python”

  1. Пингбэк: Операторы in и not in в Python

  2. Пингбэк: Как из списка сделать строку в Python - pythonturbo

  3. Пингбэк: Работа с файлами в Python - pythonturbo

  4. Пингбэк: Работа с файлами в Python

  5. Пингбэк: Как улучшить качество кода на Python

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

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