我的一个程序, 总是在退出时报异常, 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

记一个奇怪的python异常处理过程的更多相关文章

  1. 彷徨中的成长-记一个文科生的IT成长过程

    纠结了许久,要不要写这篇文章,然而最终还是写了.就权当总结与呻吟吧..当然,呻吟最开始还是发在自己的站点的,忍不住手贱,还是想发博客园. 1 剧透 人算不如天算:时隔多年,我竟然搞起了前端. 2 发端 ...

  2. 记一个centos分区大小调整过程

    1. 备份 /home 目录 [root@centos ~]# cp -r /home /home_backup 2. 查看目前磁盘使用的情况, 需要将 /dev/mapper/centos-home ...

  3. Python异常处理回顾与总结

    1 引言 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在 ...

  4. Python异常处理和进程线程-day09

    写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异 ...

  5. 记一个社交APP的开发过程——基础架构选型(转自一位大哥)

    记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...

  6. Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏

    一个程序要保持稳定运行必须要有异常处理,本文将简单介绍Python中的try-except..异常处理语句的使用. 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个 ...

  7. python异常处理try,except,else,finally,raise

    先看下else的使用: try: ... exception: ... else: ... 只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else 再看下finally: final ...

  8. Python 异常处理

    Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...

  9. python异常处理的哲学

    所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...

随机推荐

  1. gdb学习

    gdb学习 [参考资料] http://www.cnblogs.com/jiu0821/p/4483804.html 程序的运行状态有"运行"."暂停".&qu ...

  2. Hash中的一些概率计算

    Hash是把锋利的刀子,处理海量数据时经常用到,大家可能经常用hash,但hash的有些特点你是否想过.理解过.我们可以利用我们掌握的概率和期望的知识,来分析Hash中一些有趣的问题,比如: 平均每个 ...

  3. [原创]Net实现Excel导入导出到数据库(附源码)

    关于数据库导出到Excel和SQLServer数据导出到Excel的例子,在博客园有很多的例子,自己根据网上搜集资料,自己做了亦歌简单的demo,现在分享出来供初学者学习交流使用. 一.数据库导入导出 ...

  4. 获取url据对路径写法

    var _absUrl = (function () { var a; return function (url) { if (!a) a = document.createElement('a'); ...

  5. 趋势or过渡,量子点屏幕真的优于OLED?

    [导读]谁都知道买电视就是要买看起来很爽的产品,但怎么界定这个“爽”字?大部分人所知的是屏幕要够大,再近一步就是分辨率要够高——在这个4K分辨率逐步进入寻常家庭的时代,这两者已经不是选购屏幕类产品的大 ...

  6. C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)

    前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...

  7. IOS 计算两个经纬度之间的距离

    IOS 计算两个经纬度之间的距离 一 丶 -(double)distanceBetweenOrderBy:(double) lat1 :(double) lat2 :(double) lng1 :(d ...

  8. 使用GitHub进行团队合作

    原文: Team Collaboration With GitHub GitHub已经成为的一切开放源码软件的基石.开发人员喜欢它,基于它进行协作,并不断通过它开发令人惊叹的项目.除了​​代码托管,G ...

  9. 小菜鸟学 MQ(一)

    第一步: 从http://activemq.apache.org/ 下载相关文件. apache-activemq-5.8.0-bin.zip 解压到指定目录下. 第二步: cmd 下切换到   mq ...

  10. publish_subscribe

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...