2010-12-23 9 views
5

ich eine KeyError Ausnahme erhöhen will, wenn der zurückgegebene Wert None ist, aber das wirft einen Fehler: „Syntaxerror: invalid syntax“Python dict: raise Ausnahme, wenn kein Wert angetroffen

try: 
    protocol = serverInfo_D['protocol'] or raise KeyError("protocol not present") 
except KeyError: 
    print "Improper server config" 

Was für eine einfache Art und Weise ist zu funktioniert das?

+1

AFAIK Python-Wörterbuch löst bereits eine KeyError-Ausnahme aus, wenn der angegebene Schlüssel fehlt. – Simone

+1

@Simone - Er versucht, die Ausnahme auszulösen, wenn der Wert "None" ist, nicht nur wenn der Schlüssel fehlt. – Yarin

Antwort

5

Sie bekommen ein SyntaxError weil raise eine Aussage nicht ein Ausdruck ist, so dass der or raise KeyError Teil nicht der Fall ist mache [syntaktischen] Sinn. Eine Problemumgehung besteht darin, genau das in eine Funktion wie die folgende zu setzen, die nur aufgerufen wird, wenn der nachgeschlagene Wert etwas nicht Wahres ist, wie None, , '' und [].

Caveat: Beachten Sie, dass dies zu tun potenziell verwirrend ist, da effektiv, was sie tut, ist das Vorhandensein einer dieser Typen von Werten machen zu sein scheint, als ob die Schlüssel nicht da selbst waren aber technisch war es .. .so möchten Sie möglicherweise in Erwägung ziehen, Ihre eigene spezialisierte Ausnahmeklasse von einem der built-ins ableiten und dann mit denen statt [ab] unter Verwendung, was KeyErrornormally means.

def raise_KeyError(msg=''): raise KeyError(msg) # Don't return anything. 

try: 
    protocol = serverInfo_D['protocol'] or raise_KeyError('protocol not present') 
except KeyError: 
    print 'Improper server config!' 
0

Ich denke, das ist mehr nach dem, was Sie wollen. Bitte kommentieren Sie, wenn Sie es ändern müssen.

try: 
    protocol = serverInfo_D['protocol'] 
    if protocol == None: 
     raise KeyError("protocol not present") 

this helps

+0

können wir nicht verwenden und und es in einer einzigen Zeile .. coz Ich habe viele solcher Validierungen. – goutham

+3

'ist keiner' wird besser sein. – user225312

+0

Ich denke, das spricht ein anderes Problem an; Er geht davon aus, dass, wenn das angegebene Protokoll nicht behandelt wird, serverInfo_D ['protocol'] nicht gesetzt ist, so dass die Zuweisung von diesem einen KeyError auslöst. Ihr Code scheint davon auszugehen, dass er auf None gesetzt ist, daher muss ein KeyError manuell ausgelöst werden. –

1

Die try und except KeyError Kombination funktionieren sollte. Was funktioniert nicht für dich?

Und da dies in der Fortsetzung Ihrer vorherigen Frage, das war nicht funktioniert, weil Sie dict.get, die nie KeyError wirft.

Allerdings wird der Code in dieser Frage. Und Sie brauchen nicht or raise KeyError.

>>> d = dict(a=1, b=2) 
>>> d.get('c') # no KeyError 
>>> d['c']  # KeyError 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'c' 
+0

Was ist, wenn d ['c'] einen None-Wert enthält? – goutham

+0

Der 'oder raise KeyError'-Teil des OP-Codes ist ein' SyntaxError', weil 'raise' eine Anweisung und kein Ausdruck ist. – martineau

+0

Nicht ganz, was das OP gefragt hat - der Wert ist vorhanden, also wird es den KeyError nicht auslösen, aber es hat einen None-Wert, den das OP als Ausnahmefall haben möchte. – PaulMcG

5

Wenn Sie es in einer Linie will man immer eine Funktion machen könnte:

def valueOrRaise(data, key): 
    value = data.get(key) 
    if value is None: 
     raise KeyError("%s not present" % key) 
    return value 

try: 
    protocol = valueOrRaise(serverInfo_D, 'protocol') 
except KeyError: 
    print "server config is not proper" 
3

Warum möchten Sie eine Ausnahme haben, wenn Sie es wirklich so verwenden? Verwenden Sie einfach .get() und prüfen Sie auf None.

protocol = serverInfo_D.get('protocol') 
if protocol is None: 
    print "server config is not proper" 
Verwandte Themen