4

我正在使用外部库 IMAPClient。当登录失败时,我看到这个错误:imaplib.error: [AUTHENTICATIONFAILED] Authentication failed.

当我尝试时,except imaplib.error:我得到:AttributeError: 'module' object has no attribute 'error'

imaplib 的文档说异常应该是 IMAP4.error 那么为什么 IMAPClient 会引发 imaplib.error 以及如何捕获它?

4

2 回答 2

6

您看到的错误消息:

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 似乎没有“嵌套”类——只是类定义。因此,一旦存在“error”类的对象,它就是“imaplib”范围内定义的“error”类的对象。“错误”类定义在“IMAP4”类库定义中的事实与 Python 无关。另一方面,为了让您在此类对象存在之前描述类“错误”的对象,您需要将其引用为 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并继续你的生活。

于 2012-03-18T16:30:07.663 回答
2

(免责声明:我是 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)。还有AbortErrorReadOnlyError

IMAPClient 在自己引发错误时使用这些异常,因此您的代码中只有一组异常需要担心。

于 2012-05-04T12:56:31.697 回答