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()),我想创建一个不存在的文件,并在文件中写入函数名,如果最后传递,则删除文件,否则保持创建状态。(如果它坏了,我会看到文件,否则不会)这可能与decorator/how有关吗?或者在每个函数中添加这段代码来处理文件吗?

为什么不使用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)

相关内容

最新更新