Sunday, August 15, 2010

python2.4与2.5的异常基类变化

工作中, 有一服务需要从freeBSD迁移到centOS上。其中有一python脚本有些鬼异。
在freeBSD上可以正常, 在centOS上不能正常。最后目标定位在脚本最后的代码上, 大概如下:

try:                           
    if 测试条件:           
        do_someting()
        sys.exit(0)       
    else:                     
        sys.exit(1)       
except Exception:  
        sys.exit(1)       

centOS上, python的版本是2.4的。 freeBSD下安装的是2.5.
旧版本的Exception是基类: 因此在2.4上脚本永远是返回1的。
到了新的版本BaseException才是基类: 因此SystemExit和Exception是同一级。脚本可以返回0

这是迁移后的主要问题。 其实, 应该是作者不知道sys.exit的后果。作者把sys.exit当成os._exit了。
如下是APUE里的一幅图:
标准C里的exit函数在调用后, 不是马上退出程序, 而是运行一些收尾工作。比如把buffer里的数据flush到磁盘等等工作。然后才是调用真正的退出函数:_exit

python的sys.exit是抛出一个异常:SystemExit, python会默认会catch这个异常, 大意为:

try:
    我们的python代码
exception SystemExit:
    做一些收尾工作, 如flush之类的



No comments:

Post a Comment

Note: Only a member of this blog may post a comment.