2012-04-08 19 views
1

私はPythonスクリプトをいくつかのオブジェクトを使ってfor-loopsし、xml-formatのURLからデータを取り出してMySQLデータベースに格納します。私は以下のスクリプトの(簡略化した)バージョンを添付しました。 Windowsタスクスケジューラを使用してスクリプトを1日に1回実行するようにスケジュールを設定します。スクリプトとスケジューリングはほとんどの場合うまく機能しますが、月に1回または2回、スクリプトは記録された例外なしで途中で突然終了します。スクリプトが終了したことを検出して手動でスクリプトを再実行すると、問題はなく、何も変更せずに完了します。スクリプトが途中で終了したときにWindows Schedulerが問題を報告することはありません。つまり、「履歴」タブは、すべてが計画どおりに動作した場合と同様に、アクション完了/タスク完了を報告します。WindowsスケジューラでPythonスクリプトが予期せず終了する

スクリプトの

簡易版:

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

スクリプトはしばらく途中で一度の終了や、なぜ誰もが任意のアイデアを持っています私は、スクリプトまたはにスケジューリングに何かできることがあればこの問題を回避するか、少なくとも何が起こっているかを明確にするありがとう

+0

をキャッチこの方法は、あなたが全くのログを持っていない場合は、唯一の理由なぜそれが起こるのかは 'objects == []'です。あなたは 'オブジェクト'がどのように作られているかを示すコードを投稿しませんでした。もう1つの可能性は、ログファイル/ stdoutへの書き込みを開けなかったためにロガーが例外を投げたことです。 – astevanovic

+0

OK、私はスクリプト全体を含んでいませんでした。私はログを生成し、正常に動作するように見えるログを持っています。スクリプトが予期せず終了した場合、ログは100個のアイテムのうち50個を取得し、ログにはスローされた例外やその他の問題の兆候は見られません。単にスケジューラ(?)がスクリプトを終了したかのように見えます。 – hgus1294

+0

スクリプトが終了する前に例外が発生した場合、ログバッファが実際にフラッシュされていますか?たぶん例外がありましたが、ログに記録されませんでした。それは私が考えることができる唯一のことです...そうでなければ、あなたのスケジューラはプロセスを殺しています。 – astevanovic

答えて

2

あなたは言った: "記録された例外なし"?

例外は、すべての例外

>>> 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'>] 
+0

ありがとうございます。これは合理的な示唆と可能な解決策のようです。私はそれを試し、すぐに元に戻す。 – hgus1294

+0

これは私が今例外をキャッチしてログに記録するようにしました。ありがとうございます。 – hgus1294

関連する問題