Python: сбой кода - перезапустить скрипт - PullRequest
1 голос
/ 27 февраля 2012
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 и возвращает непрочитанные электронные письма. он работает нормально, но иногда возвращает эту ошибку и вылетает.

Как я могу исправить ошибку или перезапустить код в случае сбоя?

1 Ответ

1 голос
/ 27 февраля 2012

Если оператором, который не выполняется, является mail.select, вы можете заключить его в блок try/except и реализовать политику повторных попыток.

Если проблема связана с доступностью службы, вы можете попробовать стратегия экспоненциального отката с таймером, экспоненциально растущим для планирования попыток повторения.

Один простой пример может быть следующим:

selected = False
retry_timer = 1
while not selected:
    try:
        mail.select('inbox')
        selected = True
    except imaplib.abort:
        time.sleep(retry_timer)
        retry_timer *= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...