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

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

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

Здесь мы рассмотрим, как вы можете обрабатывать исключения в Python.

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

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

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

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

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

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

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

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

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

Концепция кодирования исключений Python обычно выглядит так:

 try:
"code to be executed"
except:
"error message"

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

По сути, это пригодится, если у вас есть другой блок кода, который вы хотите запускать непрерывно, независимо от того, что происходит в блоке try … except .

Вот пример:

 try:
print(9+6)
except:
print("error message")
finally:
print("please restart")
Output:
15
please restart

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

Условие else может также следовать за выражением except :

 try:
C = 2 + B
except:
print("B needs to be defined")
else:
print(u"Added successfully! The result is %s"%(C))
Output: B needs to be defined

Теперь попробуйте еще раз с определенным "B":

 try:
B = 5
C = 2 + B
except:
print("B needs to be defined")
else:
print(u"Added successfully! The result is %s"%(C))
Output: Added successfully! The result is 7

Приведенные выше примеры являются нестандартными исключениями. Но у вас может быть более явное исключение, когда вы комбинируете встроенные (определенные) исключения с нестандартными:

 try:
C = 2 + B
except NameError as err:
print(err, ":", "B needs to be defined, please")
else:
print(u"Added successfully! The result is %s"%(C))
Output: name 'B' is not defined : B needs to be defined, please

Вышеупомянутое исключение сначала проверяет, есть ли NameError в блоке try . Затем он сначала печатает стандартное исключение NameError («имя 'B' не определено»). И поддерживает это с вашим письменным исключением («B необходимо определить, пожалуйста»).

Связано: Основные принципы программирования, которые должен знать каждый программист

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

 try:
B = 5
C = 2 + B
D = float(6)
F = 7/0
except NameError as err:
print(err,":", "B needs to be defined, please")
except ValueError as val:
print(val,":", "You can't convert that data")
except ZeroDivisionError as zeroerr:
print(zeroerr,":", "You can't divide a number by zero")
else:
print(u"Operation successfull! The results are: %s, %s, and %s"%(C, D, F))
Output: division by zero : You can't divide a number by zero

Что делать, если разделение действительно? Например, замена F = 7/0 в приведенном выше коде на F = 7/5 дает:

 Output: Operation successfull! The results are: 7, 6.0, and 1.4

Пользовательские исключения в Python

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

Тем не менее, каждое определяемое пользователем исключение (прямо или косвенно) по-прежнему исходит из встроенного класса Exception Python.

В приведенном ниже примере кода делается ссылка на базовое исключение напрямую, вызывая из него RuntimeError :

 class connectionError(RuntimeError):
def __init__(self, value):
self.value = value
try:
raise connectionError("Bad hostname")
except connectionError as err:
print(err.value)
Output: Bad hostname

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

Связанный: Руководство для начинающих по регулярным выражениям с Python

Вы можете создать определяемое пользователем исключение, унаследовав его непосредственно от базового класса Exception . Однако приведенное ниже исключение предотвращает вычитание 5 из 6 и вызывает исключение напрямую из базового класса:

 class errors(Exception):
pass
class sixFiveError(errors):
def __init__(self, value, message):
self.value = value
self.message = message
try:
raise sixFiveError(6-5,"This substraction is not allowed")
except sixFiveError as e:
print("There was an error:", e.message)
Output: There was an error: This substraction is not allowed

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

 # First call the base exception classes:
class errors(Exception):
pass
# Next, derive your own exception from the base class:
class FloatError(errors):
def __init__(self, value, message):
self.value = value
self.message = message
# Create a function to add two floats:
def addTwoFloat(a, b):
if (type(a) and type(b)) != float:
raise FloatError(a+b,"Numbers must be float to add")
else:
print(a + b)
addTwoFloat(4, 7)
Output: __main__.FloatError: (11, 'Numbers must be float to add')

Поскольку вы теперь определили класс FloatError , Python поднимет его, если вы попытаетесь добавить два литерала, отличных от float, с помощью функции addtwoFloat .

Вы можете распечатать класс FloatError в том же файле Python, в котором вы его создали, чтобы увидеть, что произойдет:

 print(FloatError)
Output: <class '__main__.FloatError'>

Однако FloatError не является встроенным исключением Python. Вы можете проверить это, вызвав FloatError в другом новом файле Python, в котором вы не создавали этот класс:

 print(FloatError)
Output: NameError: name 'FloatError' is not defined

Вы получаете NameError, потому что Python не распознает его как стандартное исключение.

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

Сделайте свои программы на Python более удобными для пользователя с исключениями

В Python есть множество стандартных исключений. Но вы также можете определить свое. Тем не менее, простота использования вашей программы в некоторой степени зависит от того, как она обрабатывает различные исключения (определяемые пользователем, неспецифические или стандартные).

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