2012-02-27 30 views
1
imap_host = 'imap.gmail.com' 
mail = imaplib.IMAP4_SSL(imap_host) 
mail.login(user,passw) 
mail.select("inbox") # connect to inbox. 

while True: 
    try: 
     result, data = mail.uid('search', None, 'UNSEEN') 
     uid_list = data[0].split() 
     print len(uid_list), 'Unseen emails.' 
     time.sleep(60) 
    except KeyboardInterrupt: 
     print 'Quitting' 
     return 


Traceback (most recent call last): 
    File "gmail_new2.py", line 12, in <module> 
    mail.select("inbox") # connect to inbox 
    File "/usr/lib/python2.6/imaplib.py", line 642, in select 
    typ, dat = self._simple_command(name, mailbox) 
    File "/usr/lib/python2.6/imaplib.py", line 1060, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "/usr/lib/python2.6/imaplib.py", line 890, in _command_complete 
    raise self.abort('command: %s => %s' % (name, val)) 
imaplib.abort: command: SELECT => socket error: EOF 

コードはgmailに接続し、未読メールを返します。それはうまく動作しますが、時にはそのエラーを返し、クラッシュします。Python:コードクラッシュ - 再起動スクリプト

クラッシュ時にエラーを修正したり、コードを再起動するにはどうすればよいですか?

+0

これはどこかの関数の中でなければなりません。それ以外の場合、 'return'は構文エラーです。 –

答えて

1

失敗したステートメントがmail.selectである場合は、try/exceptブロックにラップして、再試行ポリシーを実装できます。

問題がサービスの可用性に関連している場合は、再試行回数をスケジュールするために指数関数的に増加するタイマーでexponential backoff strategyを試してみるとよいでしょう。次のように

一つの簡単な例は次のようになります。

selected = False 
retry_timer = 1 
while not selected: 
    try: 
     mail.select('inbox') 
     selected = True 
    except imaplib.abort: 
     time.sleep(retry_timer) 
     retry_timer *= 2 
+0

例外に何を追加すればよいですか? – donald

+0

私は明確にするために例を追加しました。私はそれが助けて欲しい – jcollado

+3

ちなみに指数関数的なバックオフのためのキュートなデコレータは、http://wiki.python.org/moin/PythonDecoratorLibrary#Retryにあります。 – synthesizerpatel

関連する問題