记一个奇怪的python异常处理过程
2013-06-20 14:33
513 查看
我的一个程序, 总是在退出时报异常, Exception TypeError: "'NoneType' object is not callable" in <function <lambda> at 0x016207F0> ignored. 这个异常用try except捕获不到. 不断测试来定位异常的引入点, 最后发现一旦引用了数据库模块
mydatabase, 就会报错. 但直接运行该数据库模块, 没有异常.太诡异了!
mydatabase模块, 代码很简单, 根据ini的设置, 初始化 sqlalchemy engine和 connection.
在stackoverflow 也有人就shelve模块, 问了类似问题, http://stackoverflow.com/questions/2180946/really-weird-issue-with-shelve-python
根据 Alex Martelli 大牛的提示, 我在python后加了-v , 发现时在 mydatabase模块cleanup时, 抛出了异常, 难怪无法catch住.
后来, 又搜出一个帖子, limodou 大牛发现sqlalchemy0.6.7 有类似的问题, http://comments.gmane.org/gmane.comp.python.sqlalchemy.user/31801, 官方的答复是, sqlalchemy 的 weakref cleanup 有bug. 我用的是SQLAlchemy-0.7.4, 说明这个版本也有问题. 看讨论, 0.7.7以上是没有这样的问题了.
主程序module, main.py
#coding=utf-8
'''
module main.py
'''
from fron.models import mydatabase
pass
数据库模块, mydatabase.py
#coding=utf-8
'''
module mydatabase.py
'''
from sqlalchemy import engine_from_config,create_engine
from sqlalchemy.schema import MetaData
import logging
from fron.fron_helper import fron_logging
from fron.fron_helper import fron_config
logger=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 object
connection = db.connect()
if __name__=="__main__":
print('hello mydatabase')
我又不想升级sqlalchemy, 根据 weakref cleanup 有问题这个提示, 大致判断应该是, db或 connection或metadata对象弱引用的问题, 逐一排除, 定位到关键是connection.
用如下两个函数, 代替原来的connection = db.connect() 代码行. 另外, 程序退出前, 要确保调用closeConnection()方法释放connection.
注意,我的程序是单线程,所以有一个全局connection,多线程会有问题的。
connection=None
def closeConnection():
global connection
if (connection is not None) and (connection.closed==False) :
connection.close()
logger.debug("disconnect database.")
connection=None
def getConnection():
global connection
if connection is None:
connection=db.connect()
logger.debug('To get database connection: %s',(connection,))
return connection
mydatabase, 就会报错. 但直接运行该数据库模块, 没有异常.太诡异了!
mydatabase模块, 代码很简单, 根据ini的设置, 初始化 sqlalchemy engine和 connection.
在stackoverflow 也有人就shelve模块, 问了类似问题, http://stackoverflow.com/questions/2180946/really-weird-issue-with-shelve-python
根据 Alex Martelli 大牛的提示, 我在python后加了-v , 发现时在 mydatabase模块cleanup时, 抛出了异常, 难怪无法catch住.
后来, 又搜出一个帖子, limodou 大牛发现sqlalchemy0.6.7 有类似的问题, http://comments.gmane.org/gmane.comp.python.sqlalchemy.user/31801, 官方的答复是, sqlalchemy 的 weakref cleanup 有bug. 我用的是SQLAlchemy-0.7.4, 说明这个版本也有问题. 看讨论, 0.7.7以上是没有这样的问题了.
主程序module, main.py
#coding=utf-8
'''
module main.py
'''
from fron.models import mydatabase
pass
数据库模块, mydatabase.py
#coding=utf-8
'''
module mydatabase.py
'''
from sqlalchemy import engine_from_config,create_engine
from sqlalchemy.schema import MetaData
import logging
from fron.fron_helper import fron_logging
from fron.fron_helper import fron_config
logger=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 object
connection = db.connect()
if __name__=="__main__":
print('hello mydatabase')
我又不想升级sqlalchemy, 根据 weakref cleanup 有问题这个提示, 大致判断应该是, db或 connection或metadata对象弱引用的问题, 逐一排除, 定位到关键是connection.
用如下两个函数, 代替原来的connection = db.connect() 代码行. 另外, 程序退出前, 要确保调用closeConnection()方法释放connection.
注意,我的程序是单线程,所以有一个全局connection,多线程会有问题的。
connection=None
def closeConnection():
global connection
if (connection is not None) and (connection.closed==False) :
connection.close()
logger.debug("disconnect database.")
connection=None
def getConnection():
global connection
if connection is None:
connection=db.connect()
logger.debug('To get database connection: %s',(connection,))
return connection
相关文章推荐
- druid连接池使用过程遇到的一个奇怪异常
- ARM异常---一个Uart中断的触发处理过程:
- 关于Python操作excel过程中,将多个内容写到同一个excel的不同sheet页的处理
- python flask出现数据库连接池异常的处理过程
- 处理异常刷卡记录存储过程
- python每次处理一个字符的三种方法
- python 异常处理
- Python 简单异常处理
- hadoop启动datanode的一个异常处理
- CSV文件分割与列异常处理的python脚本
- [Python]网络爬虫(三):异常的处理和HTTP状态码的分类(转)
- Win7 64位下使用oracle客户端异常的处理过程
- Py修行路 python基础 (二十二)异常处理
- 004_022 Python 在表达式中处理异常
- centos 6.5 系统中jboss4.2.3启动过程异常缓慢的问题处理一则
- python异常处理实例教程(捕捉异常、错误)
- atitit.面向过程的编程语言异常处理 c语言 asp vbs 的try catch 实现
- Python基础知识(三)--基本的异常处理、算术运算符、输入/输出
- 异常处理——python
- Python特性(十五): context manager的__exit__方法对异常的处理