Декоратор для логирования исключений

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

def exception(logger):
    """
    A decorator that wraps the passed in function and logs
    exceptions should one occur

    @param logger: The logging object
    """
    def decorator(func):

        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except:
                err = "There was an exception in "
                err += func.__name__
                logger.exception(err)

                # re-raise
                raise
        return wrapper
    return decorator

Пример использования, а заодно и проверки работы функции:

import logging
from exception_decor import exception


logger = logging.getLogger("example")
logger.setLevel(logging.INFO)

fh = logging.StreamHandler()
fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(fmt)
fh.setFormatter(formatter)
logger.addHandler(fh)


@exception(logger)
def zero_divide():
    1 / 0

if __name__ == '__main__':
    zero_divide()

Результатом работы будет запись в лог:

2016-06-13 16:04:45,656 - example - ERROR - There was an exception in zero_divide
Traceback (most recent call last):
  File "/Users/pavelmusolin/tmp/exception_decor.py", line 12, in wrapper
    return func(*args, **kwargs)
  File "test.py", line 17, in zero_divide
    1 / 0
ZeroDivisionError: integer division or modulo by zero

Источник: Python: How to Create an Exception Logging Decorator

 
comments powered by Disqus