Flask接口签名sign原理与实例代码浅析
295
2022-09-05
记一个奇怪的python异常处理过程(Python异常处理的方式)
我的一个程序, 总是在退出时报异常, Exception TypeError: "'NoneType' object is not callable" in
mydatabase, 就会报错. 但直接运行该数据库模块, 没有异常.太诡异了!
mydatabase模块, 代码很简单, 根据ini的设置, 初始化 sqlalchemy engine和 connection.
在stackoverflow 也有人就shelve模块, 问了类似问题, Alex Martelli 大牛的提示, 我在python后加了-v , 发现时在 mydatabase模块cleanup时, 抛出了异常, 难怪无法catch住.
后来, 又搜出一个帖子, limodou 大牛发现sqlalchemy0.6.7 有类似的问题, 官方的答复是, sqlalchemy 的 weakref cleanup 有bug. 我用的是SQLAlchemy-0.7.4, 说明这个版本也有问题. 看讨论, 0.7.7以上是没有这样的问题了.
主程序module, main.py
#coding=utf-8'''module main.py'''from fron.models import mydatabasepass
数据库模块, mydatabase.py
#coding=utf-8'''module mydatabase.py'''from sqlalchemy import engine_from_config,create_enginefrom sqlalchemy.schema import MetaDataimport loggingfrom fron.fron_helper import fron_loggingfrom fron.fron_helper import fron_configlogger=logging.getLogger(__name__)fron_logging.configureLogger(logger)#set default db configuration if it did not been configured.if fron_config.db_configuration is None: fron_config.refreshConfig(dbBusyApplication=False)db = engine_from_config(fron_config.db_configuration,prefix='sqlalchemy.')metadata = MetaData(bind=db)#if transaction need, use connection to create trans objectconnection = db.connect()if __name__=="__main__": print('hello mydatabase')
我又不想升级sqlalchemy, 根据 weakref cleanup 有问题这个提示, 大致判断应该是, db或 connection或metadata对象弱引用的问题, 逐一排除, 定位到关键是connection.
用如下两个函数, 代替原来的connection = db.connect() 代码行. 另外, 程序退出前, 要确保调用closeConnection()方法释放connection.
注意,我的程序是单线程,所以有一个全局connection,多线程会有问题的。
connection=Nonedef closeConnection(): global connection if (connection is not None) and (connection.closed==False) : connection.close() logger.debug("disconnect database.") connection=Nonedef getConnection(): global connection if connection is None: connection=db.connect() logger.debug('To get database connection: %s',(connection,)) return connection
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~