2010-06-24 12 views
6

que tienen un montón de código que se parece a esto:¿Existe alguna manera de manejar excepciones en Python?

   try: 
        auth = page.ItemAttributes.Author 
       except: 
         try: 
          auth = page.ItemAttributes.Creator 
         except: 
           auth = None 

¿Hay una manera más agradable para escribir esta lógica? Esto hace que mi código sea realmente doloroso de leer. Pensé try..finally quiere trabajar, pero asumí mal

Respuesta

11

Puede utilizar hasattr para evitar el try/except bloques:

auth = None 
for attrname in ['Author', 'Creator']: 
    if hasattr(page.ItemAttributes, attrname): 
     auth = getattr(page.ItemAttributes, attrname) 
     break 

Una forma alternativa de escribir lo anterior es el uso de la cláusula de else un pitón for bucle:

for attrname in ['Author', 'Creator']: 
    if hasattr(page.ItemAttributes, attrname): 
     auth = getattr(page.ItemAttributes, attrname) 
     break 
else: 
    auth = None 
+0

@ Marcos código limpio – systempuntoout

+0

1 No sólo es más limpio, sino que elimina la necesidad de tratar con excepciones por completo. – BoltClock

+0

@ Marque una duda ... ¿cómo puede estar seguro de que la página tiene ItemAttributes? Podría ser None. – systempuntoout

3

Esto hace que mi código muy doloroso leer

Haga lo que haga, no atrape comodines. except: es la manera pitónica de decir: Hey, all exceptions are equal, I want every single error in my try block to end up here, I don't care if I catch an AttributeError or a WorldGotFuckedUpException. En su caso, except AttributeError es mucho, mucho mejor Y más fácil de leer.

Esto es solo una nota al margen. La respuesta de Mark muestra la mejor manera de hacerlo, en mi humilde opinión.

+0

Haha, señaló ... Solo soy vago y probally necesito tener una experiencia realmente horrible antes de recordar atrapar excepciones específicas. – xporter

2

respuesta de @ Marcos Byers es más flexible, pero si quería una sola línea

auth = getattr(page.ItemAttributes, 'Author', None) or getattr(page.ItemAttributes, 'Creator', None) 
+4

Esto no es exactamente lo mismo - 'page.ItemAttributes.Author' podría ser' None'. El código original permite este caso. –

Cuestiones relacionadas