2010-06-24 15 views
6

Ho un sacco di codice che è simile a questo:C'è un buon modo per gestire le eccezioni in Python?

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

C'è un modo migliore per scrivere questa logica? Questo rende il mio codice davvero doloroso da leggere. Ho pensato try..finally avrebbe funzionato, ma ho assunto sbagliato

risposta

11

È possibile utilizzare hasattr per evitare il try/tranne blocchi:

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

Un modo alternativo di scrivere quanto sopra è quello di utilizzare la clausola di else un Python for ciclo:

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

@ Marco codice pulito – systempuntoout

+0

+1 non solo è più pulito ma elimina la necessità di affrontare con le eccezioni del tutto. – BoltClock

+0

@Mark un dubbio .. come puoi essere sicuro che la pagina abbia ItemAttributes? Potrebbe essere None. – systempuntoout

3

Questo rende il mio codice davvero doloroso per leggere

Qualsiasi cosa tu faccia, non prendere i caratteri jolly. except: è il modo per dire pazzesco: 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. Nel tuo caso, except AttributeError è molto, molto meglio E più facile da leggere.

Questa è solo una nota a margine. La risposta di Mark mostra il modo migliore per farlo, IMHO.

+0

Haha, ha notato ... Sono solo pigro e probabilmente ho bisogno di avere un'esperienza davvero orribile prima che mi ricorderò di cogliere eccezioni specifiche. – xporter

2

risposta di @ Mark Byers è più flessibile, ma se si voleva un one-liner

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

Questo non è esattamente lo stesso - 'page.ItemAttributes.Author' potrebbe essere' None'. Il codice originale consente questo caso. –

Problemi correlati