Вопрос проверяет умение использовать декораторы Python для централизованной обработки исключений, что улучшает читаемость и переиспользуемость кода.
Декораторы в Python — это мощный инструмент метапрограммирования, позволяющий модифицировать поведение функций или методов, оборачивая их в дополнительную логику. Обработка исключений внутри декоратора — это распространённый паттерн для централизации логики отлова и обработки ошибок. Вместо того чтобы писать одинаковые блоки try-except в каждой функции, вы создаёте один декоратор, который делает это за вас, улучшая поддержку кода и соблюдая принцип DRY (Don't Repeat Yourself).
Декоратор — это функция, которая принимает целевую функцию (func) в качестве аргумента и возвращает новую функцию-обёртку (wrapper). Внутри этой обёртки мы вызываем исходную функцию, поместив вызов в блок try-except. Это позволяет перехватывать исключения, возникающие при выполнении func, и обрабатывать их единообразно.
Рассмотрим простой декоратор, который логирует любые исключения и повторно их возбуждает. Это полезно для отладки.
import logging
logging.basicConfig(level=logging.ERROR)
def exception_handler_decorator(func):
def wrapper(*args, **kwargs):
try:
# Вызываем исходную функцию
return func(*args, **kwargs)
except Exception as e:
# Логируем ошибку
logging.error(f"Exception in {func.__name__}: {e}")
# Можно выполнить дополнительные действия, например, отправить уведомление
# Или вернуть значение по умолчанию
# return None
# Либо повторно возбудить исключение
raise
return wrapper
# Применение декоратора
@exception_handler_decorator
def risky_division(a, b):
return a / b
# Вызов функции
result = risky_division(10, 2) # Работает
# result = risky_division(10, 0) # Вызовет ZeroDivisionError, который будет залогированТакой подход часто используется в веб-разработке (например, с Flask или Django) для обработки ошибок в обработчиках маршрутов, в задачах Celery для управления сбоями, или в клиентах API для реализации повторных попыток (retry logic). Декоратор может быть расширен для обработки конкретных типов исключений, отправки оповещений или возврата стандартных ответов в случае ошибки.
Вывод: Используйте декораторы для обработки исключений, когда вам нужно применить одинаковую логику обработки ошибок к нескольким функциям, чтобы избежать дублирования кода и повысить его надёжность и удобство сопровождения.