python ldap.LDAPError对象拒绝访问字典
我在使用 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 不能是字典,因为它必须是一个异常对象)。