我有很多带各种参数的函数,我正在做一些事情。
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())
不存在,并在文件内写入函数名称,如果最后通过删除文件,则保持创建。 (如果它坏了我会看到文件,否则不会)
这可能与装饰器/如何或在每个函数中添加此代码来处理文件?
答案 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)