Python脚本意外终止Windows Scheduler

时间:2012-04-08 14:25:52

标签: python windows scheduler

我有一个Python脚本,用于循环访问某些对象,并以xml格式从URL获取数据并将其存储在MySQL数据库中。我在下面附上了一个(简化)脚本版本。我安排脚本每天运行一次Windows任务计划程序。脚本和调度在大多数情况下都能正常工作,但每月一次或两次脚本会在某个位置意外终止而没有任何记录的异常。当我检测到脚本已终止并手动重新运行脚本时,它完成没有任何问题且没有任何更改。当脚本过早终止时,Windows Scheduler永远不会报告任何问题,即“历史记录”选项卡仅报告“已完成操作/完成任务”,就像所有内容按计划完成一样。

简化版脚本:

for Obj in objects:
   t=0
   dbdata = ''
   logger.info('Object: {s}\tID: {i}'.format(s=Obj.name, i=Obj.id))
    try:
        url = 'http://www.xyz.com/webproxy/DataProxy.aspx?Object=' + Obj.id
        logger.debug(url)
        data = urlopen(url)
        dom = minidom.parse(data)
        for node in reversed(dom.getElementsByTagName('t')):
            dbdata = dbdata + str(node.getAttribute('t')) + '\t' + str(float(node.getAttribute('p'))) + '\t' + str(int(node.getAttribute('v'))) + '\t' + str(node.getAttribute('id')) + '\t' + str(node.getAttribute('b')) + '\t' + str(node.getAttribute('s')) + '\n'
            t=t+1
        if len(dbdata)>0:
            cursor.execute(sql,(Obj.id,Obj.name,daydb,dbdata))
        logger.info('# rows: {n}'.format(n=t)
    except HTTPError, e:
        logger.error(e.msg)
        logger.error('HTTPError. Error code: ' + str(e.code))
    except ExpatError, ex:
        logger.error(ex.msg)
        logger.error('Expat Error. Error code: ' + str(ex.code))
    except Exception, e:
        logger.error(e.msg)
        logger.error('Exception. Error code: ' + str(e.code))

有没有人有任何想法为什么脚本每隔一段时间就会过早终止,或者我是否可以在脚本或日程安排中做些什么来避免这个问题,或者至少为发生的事情添加一些清晰度?感谢

1 个答案:

答案 0 :(得分:2)

你说:“没有任何记录的例外情况”?

这可能是因为Exception不是所有异常的基类

>>> help(Exception)
Help on class Exception in module exceptions:

class Exception(BaseException)
 |  Common base class for all non-exit exceptions.
 |  
 |  Method resolution order:
 |      Exception
 |      BaseException
 |      __builtin__.object

BaseException是基类。

但是,如果您想获得所有例外情况,我建议您这样做:

try:
   ...
except:
    import sys
    error_type, error, traceback = sys.exc_info()

这样你也可以捕获SystemExit

>>> SystemExit.mro()
[<type 'exceptions.SystemExit'>, <type 'exceptions.BaseException'>, <type 'object'>]