【问题标题】:Catching imaplib exception (using IMAPClient package) in Python在 Python 中捕获 imaplib 异常(使用 IMAPClient 包)
【发布时间】:2012-04-03 07:47:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: python imaplib


    【解决方案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 在自身引发错误时会使用这些异常,因此您的代码中只需担心一组异常。

    【讨论】:

    • 嘿,谢谢你让这个更清楚一点。所以,为了确认我的理解,AbortErrorReadOnlyError 继承自基本异常 imaplib.IMAP4.error?
    • 是的,但是是间接的。 AbortError 和 ReadOnlyError 从 imaplib.IMAP4.abort 和 imap.IMAP4.readonly 继承,这两个又从 imaplib.IMAP4.error 继承。
    【解决方案2】:

    你看到的错误信息:

    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 并继续您的生活。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 2023-03-03
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多