1

我有一个 Python 脚本,它遍历一些对象并从 xml 格式的 url 获取数据并将其存储在 MySQL 数据库中。我在下面附上了一个(简化的)脚本版本。我使用 Windows 任务计划程序安排脚本每天运行一次。脚本和调度在大多数情况下都可以正常工作,但每月一次或两次,脚本在中途某个地方意外终止,没有任何记录的异常。当我检测到脚本已终止并手动重新运行脚本时,它会在没有任何问题且没有任何更改的情况下完成。当脚本提前终止时,Windows 调度程序从不报告任何问题,即“历史记录”选项卡只报告操作完成/任务完成,就像一切都按计划进行时一样。

脚本的简化版本:

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))

有没有人知道为什么脚本每隔一段时间就会过早终止,或者我可以在脚本或日程安排中做些什么来避免这个问题,或者至少让正在发生的事情更加清晰?谢谢

4

1 回答 1

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'>]
于 2012-04-08T16:02:17.323 回答