2010-11-25 2 views
2

с использованием python 2.6.5 и python-ldap 2.3.10 У меня есть следующая проблема: При определенных обстоятельствах мое приложение вызывает ldap.LDAPError, а точнее, Ошибка ldap.INVALID_SYNTAX. Я поймаю эту ошибку и хочу обработать прикрепленное к ней сообщение. Теперь я могу сделать что-то вроде этого:объект python ldap.LDAPError отклоняет доступ к словарю

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'} 

Теперь это dictrionary, и, насколько я понимаю, я должен быть в состоянии сделать что-то вроде

print e['info'] 

который нет в таком случае. Вместо этого я получаю код TypeError Exception: индекс последовательности должен быть целым, а не 'str'

Что здесь не так?

ответ

1

Вы искажая, что вы видите

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.args [0], который является строкой. Эта строка выглядит как словарь словаря, но это не означает, что e является словарем (на самом деле должно быть ясно, что e не может быть словарем, поскольку это должно быть исключением).

+2

Круто. Поэтому, чтобы получить то, что я хочу, мне нужно всего лишь распечатать e.args [0] ['info'] – Isaac

+0

Я вижу: по-видимому, они действительно помещают словарь в аргумент исключения. Это отклоняется от соглашения, которое утверждает, что [0] должно быть строкой. –

2

документы утверждают, что

Исключений сопровождается словарем, возможно, содержащего строкового значения ключа по алфавиту (дающий английское описание класса ошибок) и/или строковое значение для ключа info (давая строку , содержащую дополнительную информацию о том, что сервер, возможно, отправил).

так Результирующий код должен выглядеть следующим образом:

try: 
    ... 
except LDAPError, e: 
    if 'desc' in e.message: 
     print "LDAP error: %s" % e.message['desc'] 
    else: 
     print e 
Смежные вопросы