Обработка исключений в Python
В вычислениях и компьютерном программировании обработка исключений — это процесс реагирования на возникновение исключений — аномальных или исключительных условий, требующих специальной обработки.
В Python есть много встроенных исключений, которые вызываются, когда программа сталкивается с ошибкой, и большинство внешних библиотек, таких как популярная Requests, включают свои пользовательские исключения, с которыми нам придется иметь дело.
Базовая обработка исключений
Нельзя делить на ноль, это математическая истина, и если вы попытаетесь сделать это в Python, интерпретатор вызовет встроенное исключение ZeroDivisionError:
def divide(dividend , divisor):
print(dividend / divisor)
divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
Предположим, мы не хотим, чтобы наше выполнение программы останавливалось или чтобы пользователю выводился непонятный ему результат. Скажем, мы хотим напечатать полезное и понятное сообщение, тогда нам нужно обработать исключение с помощью ключевых слов try и except:
# try-except: обрабатывать исключения корректно
def divide(dividend , divisor):
try: # Попытаться выполнить этот код
print(dividend / divisor)
except ZeroDivisionError: # Перехватить конкретный тип исключения
print('You can not divide by 0')
divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
You can not divide by 0
Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения
try и exceptcatch и handleerror и rescueif и elseОбработка нескольких исключений с помощью одного блока исключений
Вы также можете обрабатывать несколько исключений в одной строке, как показано ниже, без необходимости создавать несколько блоков исключений.
# Обработка нескольких исключений в одном блоке except
def divide(dividend , divisor):
try:
if (dividend == 10):
var = 'str' + 1 # Это вызовет TypeError
else:
print(dividend / divisor)
except (ZeroDivisionError, TypeError) as error: # Перехват нескольких типов исключений
print(error) # Вывод сообщения об ошибке
divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения
except?exceptexcept (Exception1, Exception2)Код finally при обработке исключений
Код внутри секции finally всегда выполняется, независимо от того, было ли вызвано исключение или нет:
# Блок finally: выполняется всегда, независимо от исключений
def divide(dividend , divisor):
try:
print(dividend / divisor)
except ZeroDivisionError:
print('You can not divide by 0')
finally: # Выполняется всегда, даже если произошло исключение
print('Execution finished')
divide(dividend=10, divisor=5)
2.0
Execution finished
divide(dividend=10, divisor=0)
You can not divide by 0
Execution finished
Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения
finally?Пользовательские исключения
Пользовательские исключения инициализируются путем создания class, который наследуется от базового класса Exception Python, и вызываются с помощью ключевого слова raise:
# Пользовательское исключение: создается путем наследования от класса Exception
class MyCustomException(Exception):
pass
raise MyCustomException # Вызов пользовательского исключения
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.MyCustomException
Чтобы объявить сообщение пользовательского исключения, вы можете передать его в качестве параметра:
class MyCustomException(Exception):
pass
raise MyCustomException('A custom message for my custom exception')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.MyCustomException: A custom message for my custom exception
Обработка пользовательского исключения такая же, как и любой другой:
try:
raise MyCustomException('A custom message for my custom exception')
except MyCustomException:
print('My custom exception was raised')
My custom exception was raised
Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения
Exception@exceptionException.create()