2012-02-27 54 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'是一個語法錯誤。 – 2012-02-27 10:00:16

回答

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 2012-02-27 09:25:48

+0

我添加了一個例子,使其更清晰。我希望它有幫助。 – jcollado 2012-02-27 09:31:36

+3

順便說一句,可以在這裏找到一個可愛的裝飾指數退出http://wiki.python.org/moin/PythonDecoratorLibrary#Retry – synthesizerpatel 2012-02-27 09:39:43