2010-12-23 10 views
5

quiero plantear una excepción de KeyError si el valor devuelto es None, pero esto genera un error: "SyntaxError: no válido"pitón: elevar una excepción si el valor ninguno encontró

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

¿Cuál es una manera simple de hacer que esto funcione?

+1

AFAIK El diccionario Python ya arroja una excepción KeyError si falta la clave especificada. – Simone

+1

@Simone - Está intentando levantar la excepción cuando el valor es 'Ninguno', no solo cuando falta la clave. – Yarin

Respuesta

5

que está recibiendo un SyntaxError porque raise no es una declaración de una expresión, por lo que la parte or raise KeyError no lo hace hacer sentido [sintáctico]. Una solución es poner eso en una función como la siguiente, que solo se llama si el valor buscado es algo no verdadero, como None, 0, '' y [].

Advertencia: Tenga en cuenta que al hacer esto es potencialmente confuso ya que lo que hace es hacer efectiva la presencia de cualquiera de estos tipos de valores parece ser como si la tecla no estaba allí a pesar de que técnicamente era .. Así que es posible que desee considerar derivar su propia clase de excepción especializada de uno de los built-ins y luego tratar con esos en lugar de [ab] utilizando 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

Creo que esto es más en la línea de lo que desea. Por favor comente si necesita que cambie.

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

Esperanza esto ayuda

+0

no podemos usar o ponerlo en una sola línea ... porque tengo muchas de esas validaciones. – goutham

+3

'is None' será mejor. – user225312

+0

Creo que esto resuelve un problema diferente; él asume que si el protocolo especificado no se maneja, entonces serverInfo_D ['protocol'] no está configurado, por lo que al asignarlo se lanza un KeyError. Su código parece suponer que está configurado a Ninguno, por lo tanto, un KeyError se debe lanzar manualmente. –

1

La combinación try y except KeyError debería funcionar. ¿Qué no está funcionando para ti?

Y puesto que esta en la continuación de su pregunta anterior, que no estaba funcionando debido a que estaba utilizando dict.get, que nunca vomita KeyError.

Sin embargo, el código en esta pregunta sí. Y no necesita 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

¿Qué pasa si d ['c'] contiene un valor None? – goutham

+0

La parte 'o aumentar KeyError' del código del OP es' SyntaxError' porque 'raise' es una declaración, no una expresión. – martineau

+0

No es exactamente lo que pidió el OP: el valor está presente, por lo que no generará el KeyError, pero tiene un valor None, que el OP quiere que sea un caso de excepción. – PaulMcG

5

Si lo desea, en una línea siempre se puede hacer una función:

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

¿Por qué quieres tener una excepción, si realmente la estás usando así? Solo use .get() y busque None.

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