2010-11-25 5 views
2

mit Python 2.6.5 und Python-ldap 2.3.10, habe ich das folgende Problem: Unter bestimmten Umständen löst meine Anwendung ein ldap.LDAPError, oder um genauer zu sein, ein ldap.INVALID_SYNTAX Fehler. Ich erhalte diesen Fehler und möchte die angehängte Nachricht verarbeiten. Jetzt kann ich etwas tun:python ldap.LDAPError Objekt lehnt den Zugriff auf Wörterbuch

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

Das gibt mir

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

Nun ist dies eine dictrionary, und soweit ich verstehen, sollte ich in der Lage sein, etwas zu tun, wie

print e['info'] 

was nicht der Fall ist. Stattdessen erhalte ich eine TypeError Exception: Sequenz-Index muss ganzzahlig sein, nicht 'str'

Was ist hier falsch?

Antwort

1

Sie sind falsch interpretiert, was Sie

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'}",) 

So drucken e druckt e.args [0] sehen, die eine Zeichenfolge ist. Diese Zeichenfolge sieht aus wie der Ausdruck eines Wörterbuchs, aber das bedeutet nicht, dass e ein Wörterbuch ist (in der Tat sollte es klar sein, dass e kein Wörterbuch sein kann, da es eine Ausnahme sein muss).

+2

kühlen. Um zu bekommen, was ich will, muss ich nur e.args [0] ['info'] drucken. – Isaac

+0

Ich sehe: anscheinend haben sie wirklich ein Wörterbuch in das Ausnahmeargument eingefügt. Das weicht von der Konvention ab, dass args [0] eine Zeichenkette sein sollte. –

2

docs sagen, dass

die Ausnahmen von einem Wörterbuch begleitet werden möglicherweise einen String-Wert für den Schlüssel ab (was eine englische Beschreibung der Fehlerklasse) und/oder einen String-Wert für den Schlüssel enthält, info (gibt eine Zeichenfolge mit mehr Informationen, die der Server möglicherweise gesendet hat).

so resultierende Code sollte wie folgt aussehen:

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