python ldap.LDAPError对象拒绝访问字典

2 投票
2 回答
4319 浏览
提问于 2025-04-16 07:36

我在使用 Python 2.6.5 和 python-ldap 2.3.10 的时候,遇到了一个问题:在某些情况下,我的应用程序会出现 ldap.LDAPError,具体来说是 ldap.INVALID_SYNTAX 错误。我捕获到这个错误后,想要处理它附带的消息。

现在我可以这样做:

try:
  some_ldap_function(*args,connection=con,**kwargs)
except ldap.INVALID_SYNTAX,e:
  print e

这样我就能得到

{'info': 'feeClass: value #0 invalid per syntax', 'desc': 'Invalid syntax'}

现在这个是一个字典,按照我的理解,我应该能这样做:

print e['info']

但实际上并不是这样。我反而得到了一个 TypeError 异常:序列索引必须是整数,而不是 'str'。

这到底是怎么回事呢?

2 个回答

2

文档中说明:

这些异常会附带一个字典,这个字典可能包含一个键为 desc 的字符串值(这个值是错误类别的英文描述),和/或一个键为 info 的字符串值(这个值包含服务器可能发送的更多信息)。

所以,最终的代码应该像这样:

try:
    ...
except LDAPError, e:
    if 'desc' in e.message:
        print "LDAP error: %s" % e.message['desc']
    else: 
        print e
2

你可能误解了你看到的内容

py> e=ldap.INVALID_SYNTAX("{'info': 'feeClass: value #0 invalid per syntax', 'desc': 'Invalid syntax'}")
py> print e
{'info': 'feeClass: value #0 invalid per syntax', 'desc': 'Invalid syntax'}
py> e.args
("{'info': 'feeClass: value #0 invalid per syntax', 'desc': 'Invalid syntax'}",)

所以打印 e 的时候其实是打印 e.args[0],这个是一个字符串。这个字符串看起来像是一个字典的表示方式,但这并不意味着 e 就是一个字典(实际上,应该很明显 e 不能是字典,因为它必须是一个异常对象)。

撰写回答