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文件

来自此模块的任何错误引发异常(未捕获来自套接字模块的错误)。异常原因作为字符串传递给构造函数。

所以,你不需要解码它。


更新似乎文档与实际实现不匹配。

您可以使用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 回答