我正在使用外部库IMAPClient。登录失败时,我看到此错误:imaplib.error: [AUTHENTICATIONFAILED] Authentication failed.
当我尝试except imaplib.error:
时,我得到:AttributeError: 'module' object has no attribute 'error'
imaplib的文档说该异常应该是IMAP4.error 那么为什么IMAPClient会提升imaplib.error以及如何捕获它呢?
答案 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
相同)。还有AbortError
和ReadOnlyError
。
IMAPClient在引发错误时会使用这些异常,因此代码中只需要担心一组异常。