我有很多带有各种参数的函数,在里面我正在做一些类似的事情
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)