2012-02-27 143 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