Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: Python, decorator, exception handling, try except, wrapper function

Как реализовать обработку исключений в декораторе?

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

Короткий ответ

Декоратор в Python — это функция, которая принимает другую функцию и возвращает новую, обычно обёрнутую. Чтобы обрабатывать исключения, нужно внутри функции-обёртки (wrapper) использовать блок try-except. Это позволяет перехватывать ошибки, логировать их или выполнять корректирующие действия, не изменяя исходную функцию. Такой подход полезен для добавления сквозной функциональности, например, логирования ошибок или повторных попыток, ко многим функциям сразу.

Длинный ответ

Декораторы в 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). Декоратор может быть расширен для обработки конкретных типов исключений, отправки оповещений или возврата стандартных ответов в случае ошибки.

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

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Python

    Python

  • PyTest

Ключевые слова

#Python

#decorator

#exception handling

#try except

#wrapper function

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.