1

これは poplib.error_proto のコードのようです。

class error_proto(Exception): pass

例外で POP 応答からのバイトを渡すだけです。私がやりたいことは、例外をキャッチし、それらのバイトを取得し、それらに .decode('ascii') を使用して、それらを文字列として出力することです。私は自分のテスト設定を次のように書きました:

class B(Exception): pass

def bex(): raise B(b'Problem')

try:
    bex()
except B as err:
    print(err.decode('ascii'))

最後の行を次のように置き換えてみました。

    b = bytes(err)
    print(b.decode('ascii'))

しかし、役に立たない。これは可能ですか?もしそうなら、どうすればこれを実装できますか?

更新: falsetru が指摘しているように、ドキュメントには結果が文字列として返されると書かれていますが、そうではありません:

>>> p = poplib.POP3('mail.site.com')
>>> p.user('skillian@site.com')
b'+OK '
>>> p.pass_('badpassword')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python33\lib\poplib.py", line 201, in pass_
    return self._shortcmd('PASS %s' % pswd)
  File "C:\Python33\lib\poplib.py", line 164, in _shortcmd
    return self._getresp()
  File "C:\Python33\lib\poplib.py", line 140, in _getresp
    raise error_proto(resp)
poplib.error_proto: b'-ERR authorization failed  Check your server settings.'
>>>
4

1 に答える 1

2

poplib.error_protoドキュメントによると:

このモジュールからのエラーで例外が発生します (ソケット モジュールからのエラーは捕捉されません)。例外の理由は、コンストラクターにstringとして渡されます。

したがって、デコードする必要はありません。


更新ドキュメントが実際の実装と一致していないようです。

args属性を使用して、例外コンストラクターに渡された引数にアクセスできます。

p = poplib.POP3('mail.site.com')
try:
    p.user('skillian@site.com')
    p.pass_('badpassword')
except poplib.error_proto as e:
    print(e.args[0].decode('ascii')) # `'ascii'` is not necessary.
于 2013-12-13T14:55:42.880 に答える