Decorator将函数名存储到文件中,如果没有错误则删除

时间:2013-11-29 11:13:31

标签: python python-2.7 sqlalchemy decorator

我有很多带各种参数的函数,我正在做一些事情。

session = Session()
try:
    # do something with parameters
except Exception as e:
    print e.message
    session.rollback()
finally:
    session.close()

我看到一些函数看起来像是破坏了代码/错误并且最终没有通过,并且与sqlalchemy / postgresql的连接永远停留在IDLE中。 对于函数的每次传递,我想创建文件,如果文件名'log_db_' + str(os.getpid())不存在,并在文件内写入函数名称,如果最后通过删除文件,则保持创建。 (如果它坏了我会看到文件,否则不会) 这可能与装饰器/如何或在每个函数中添加此代码来处理文件?

1 个答案:

答案 0 :(得分:1)

为什么不使用Python的标准工具?像正确的异常处理和使用logging模块一样?

import logging
logger = logging.getLogger(__name__)


def func1(*params):
    logger.debug("BEGIN func1(%s)", (params,))
    session = Session()

    try:
        do_something_with(params)

    except Exception as e:
        logger.exception("FAILED func1(%s)", (params,))

        logger.debug("ROLLINGBACK func1(%s)", (params,))
        session.rollback()
        logger.debug("ROLLEDBACK func1(%s)", (params,))

        # if you don't handle exceptions let them propagate, thanks
        raise 

    else:
        logger.debug("SUCCEEDED func1(%s)", (params,))
        # don't you need a session.commit() somewhere ???

    finally:
        logger.debug("CLOSING func1(%s)", (params,))
        session.close()
        logger.debug("CLOSED func1(%s)", (params,))

现在您只需要配置您的记录器,您可能会比实现半生不熟的临时解决方案更快地找到正在发生的事情。

哦,如果只有params和“do_something_with(params)部分不同的几个函数中的模式相同,那么将所有日志记录和事务处理代码包装在装饰器中:

def manage(func):
    def wrapper(*args, **kw):
        session = Session()
        try:
            logger.debug("BEGIN %s(%s, %s)", (func, args,kw))
            result = func(*args, **kw)
            logger.debug("SUCCEEDED %s(%s, %s)", (func, args,kw))
            # don't you need a session.commit() somewhere ???
            return result

        except Exception as e:
            logger.exception("FAILED %s(%s, %s)", (func, args,kw))

            logger.debug("ROLLINGBACK %s(%s, %s)", (func, args,kw))
            session.rollback()
            logger.debug("ROLLEDBACK %s(%s, %s)", (func, args,kw))

            # if you don't handle exceptions let them propagate, thanks
            raise 


        finally:
            logger.debug("CLOSING %s(%s, %s)", (func, args,kw))
            session.close()
            logger.debug("CLOSED %s(%s, %s)", (func, args,kw))

    return wrapper    

    @manage
    def func1(*params):
        do_something_with(params)