При разработке на 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».
Пингбэк: Операторы in и not in в Python
Пингбэк: Как из списка сделать строку в Python - pythonturbo
Пингбэк: Работа с файлами в Python - pythonturbo
Пингбэк: Работа с файлами в Python
Пингбэк: Как улучшить качество кода на Python
Пингбэк: Как возвести число в квадрат в Python