Декоратор - это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию, обычно с расширенным или измененным поведением. В случае с декоратором для логирования exception'ов, мы хотим создать декоратор, который будет автоматически логировать исключения, возникающие внутри декорируемой функции.
В Python для логирования исключений мы можем использовать стандартный модуль logging
, который предоставляет мощный функционал для логирования данных. Предположим, что у нас уже есть настроенный логгер logger
из модуля logging
, и мы хотим использовать его для логирования исключений.
Декоратор для логирования exception'ов можно реализовать следующим образом:
import logging import functools def exception_logger(func): @functools.wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: logger.error(f"Exception in {func.__name__}: {e}") # Обработка исключения # Можно выбросить исключение дальше, если требуется, используя `raise` return wrapper
Давайте рассмотрим этот код подробнее:
- Мы импортируем модули
logging
иfunctools
, а также нашу заранее настроенный логгерlogger
. - Создаем функцию
exception_logger
, которая принимает функциюfunc
в качестве аргумента. - Мы используем декоратор
functools.wraps
для сохранения метаданных исходной функцииfunc
, что полезно для отладки. - Внутри декоратора определяется внутренняя функция
wrapper
, которая будет вызвана вместо исходной функцииfunc
. - Внутри этой функции
wrapper
обрабатываем исключения, которые могут возникнуть при вызовеfunc
. - Если исключение возникает, мы записываем сообщение о нем в лог с помощью
logger.error
, используя имя функцииfunc.__name__
и информацию об исключенииe
. - Здесь вы также можете добавить любую другую обработку исключений, если это необходимо. Например, вы можете выбросить исключение дальше с помощью
raise
, если требуется. - В конце мы возвращаем обернутую функцию
wrapper
, которая теперь будет вызвана вместо исходной функцииfunc
.
Теперь мы можем использовать этот декоратор для логирования exception'ов в любой функции, которую мы хотим обернуть. Просто поместите @exception_logger
над определением функции, как показано ниже:
@exception_logger def my_function(): # Код функции
Когда функция my_function
будет вызвана, и если внутри нее возникнет исключение, оно будет автоматически залогировано. Вы можете выбрать уровень логирования (например, debug
, info
, error
) в зависимости от ваших потребностей.