Перехват исключений imaplib (с использованием пакета IMAPClient) в Python - PullRequest
3 голосов
/ 18 марта 2012

Я использую внешнюю библиотеку IMAPClient. Когда не удается войти в систему, я вижу эту ошибку: imaplib.error: [AUTHENTICATIONFAILED] Authentication failed.

Когда я пытаюсь except imaplib.error: я получаю: AttributeError: 'module' object has no attribute 'error'

Документация imaplib гласит, что исключение должно быть IMAP4.error Тогда почему IMAPClient вызывает imaplib.error и как мне его поймать?

Ответы [ 2 ]

6 голосов
/ 18 марта 2012

Сообщение об ошибке, которое вы видите:

imaplib.error: [AUTHENTICATIONFAILED] Authentication failed.

описывает ошибку как можно лучше;во время возникновения исключения класс исключения называется imaplib.error, потому что тот, кто его вызывает, описал его таким образом (подробнее об этом позже).Я осмотрелся и, кажется, нашел его для вас:

Python 2.7.2 (default, Nov 14 2011, 19:37:59) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imaplib
>>> imaplib.IMAP4.error
<class 'imaplib.error'>

Я открыл файл imaplib.py и нашел что-то вроде странного механизма генерации исключений.«IMAP4» - это класс, а «error» - это класс, определенный внутри класса IMAP4.Python, кажется, не «вкладывает» классы - только определения классов.Таким образом, если объект класса «ошибка» существует, это объект класса «ошибка», который был определен в области действия «imaplib».Тот факт, что определение класса «error» было внутри определения lib класса «IMAP4», не имеет значения для Python.С другой стороны, чтобы описать объект класса «error» до того, как такой объект существует, вам нужно сослаться на него как imaplib.IMAP4.error, чтобы Python мог найти определениекласс, о котором вы говорите.

Я очень запутан, я знаю, и я не знал всего этого до того, как начал исследовать вопрос.Вот краткая иллюстрация:

Python 2.7.2 (default, Nov 14 2011, 19:37:59) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class foo(object):
...   class bar(object):
...     pass
...   def b(self):
...     return bar()
... 
>>> bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'bar' is not defined
>>> foo.bar
<class '__main__.bar'>
>>> foo().bar()
<__main__.bar object at 0x10048dd10>

По сути, вы пытались сделать очень разумную вещь, но способ, которым библиотека imaplib обрабатывает генерирование исключений, немного странный, что делает вашу жизнь трудной.Короче говоря, вы должны попытаться поймать imaplib.IMAP4.error и двигаться дальше по жизни.

1 голос
/ 04 мая 2012

(Отказ от ответственности: я поддерживаю IMAPClient)

IMAPClient использует imaplib под капотом, поэтому вы видите ошибки imaplib при его использовании.Чтобы немного упростить ситуацию, исключения imaplib добавлены в класс IMAPClient.Чтобы отловить ошибки из IMAPClient, вы можете сделать что-то вроде этого:

from imapclient import IMAPClient

try:
    client = IMAPClient(...)
    client.do_something(...) 
    client.logout()
except IMAPClient.Error, err:
    # handle error here

Error - это базовый класс исключений (такой же, как imaplib.IMAP4.error).Также есть AbortError и ReadOnlyError.

IMAPClient использует эти исключения, когда сам вызывает ошибки, поэтому в вашем коде есть только один набор исключений, о которых нужно беспокоиться.

...