在Python中捕获imaplib异常(使用IMAPClient包)

时间:2012-03-18 16:00:50

标签: python imaplib

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

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

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

2 个答案:

答案 0 :(得分: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文件,发现了一个奇怪的异常抛出机制。 &#34; IMAP4&#34;是一个类,&#34;错误&#34;是IMAP4类中定义的类。 Python并没有出现在#34; nest&#34;类 - 只是类定义。所以一旦上课的对象&#34;错误&#34;存在,它是一个阶级的对象&#34;错误&#34;这是在范围&#34; imaplib&#34;中定义的。事实上&#34;错误&#34;类定义在&#34; IMAP4&#34;内。 class lib定义与Python无关。另一方面,为了让你描述一个类的对象&#34;错误&#34; 这样的对象存在之前,你需要将它作为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 :(得分:1)

(免责声明:我是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在引发错误时会使用这些异常,因此代码中只需要担心一组异常。