1

いくつかのオブジェクトを for ループし、xml 形式の URL からデータを取得して MySQL データベースに保存する Python スクリプトがあります。以下のスクリプトの (簡略化された) バージョンを添付しました。Windows タスク スケジューラを使用して、スクリプトを 1 日 1 回実行するようにスケジュールします。ほとんどの場合、スクリプトとスケジューリングは問題なく機能しますが、月に 1 回か 2 回、ログに記録された例外がなく途中でスクリプトが予期せず終了します。スクリプトが終了したことを検出し、スクリプトを手動で再実行すると、問題も変更もなしに完了します。スクリプトが途中で終了した場合、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 に答える