2012-03-18 21 views
3

私は外部ライブラリIMAPClientを使用しています。私はexcept imaplib.error:をしようとすると私が得るimaplib.error: [AUTHENTICATIONFAILED] Authentication failed.Pythonでimaplib例外を捕捉する(IMAPClientパッケージを使用)

::ログインに失敗したとき、私はこのエラーが表示AttributeError: 'module' object has no attribute 'error'

imaplibのドキュメントには、例外が例外はIMAP4.error なぜIMAPClientはimaplib.errorを上げていると、あるべきと述べていますどのように私はそれをキャッチしますか?

答えて

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"クラスのlib定義の内側にあるという事実は、Pythonとは無関係です。一方、クラス "エラー" のオブジェクトを記述するためには、のようなオブジェクトが存在するので、Pythonがあなたのクラスの定義を見つけるためには、そのオブジェクトをimaplib.IMAP4.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. 
>>> 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

(免責事項:私は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はエラーが発生したときにこれらの例外を使用するため、コード内で心配する例外は1セットだけです。

+0

こんにちは、これを少しきれいにしてくれてありがとう。だから、私の理解を確認するために、 'AbortError'と' ReadOnlyError'は基本例外 'imaplib.IMAP4.error'を継承していますか? –

+0

はい、ただし間接的です。 AbortErrorとReadOnlyErrorは、imaplib.IMAP4.abortとimap.IMAP4.readonlyを継承し、どちらもimaplib.IMAP4.errorから継承します。 –

関連する問題