2013-06-26 16 views
21

Ho un problema con il mio codice nel blocco try. per rendere più facile questo è il mio codice:più codici in un blocco try

try: 
    code a 
    code b #if b fails, it should ignore, and go to c. 
    code C#if c fails, go to d 
    code d 
except: 
    pass 

è qualcosa di simile possibile?

+1

Per essere espliciti, si vuole 'C' codice da eseguire * solo quando il codice b genera un'eccezione *? –

+0

Tutti i codici devono essere eseguiti, in un blocco try, anche se sollevano un'eccezione. – arvidurs

+0

Non puoi averlo. Un blocco 'try' non è lì per sopprimere le eccezioni su tutto il codice eseguito. Ti farà * catturare * l'eccezione quando succede, ma il resto del blocco non viene mai eseguito. –

risposta

30

Dovrete fare questo separatitry blocchi:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    try: 
     code c 
    except ExplicitException: 
     try: 
      code d 
     except ExplicitException: 
      pass 

Questo presuppone che si desidera eseguire code csolo se code b fallito.

Se avete bisogno di eseguire code cindipendentemente, è necessario mettere le try blocchi uno dopo l'altro:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    pass 

try: 
    code c 
except ExplicitException: 
    pass 

try: 
    code d 
except ExplicitException: 
    pass 

sto usando except ExplicitException qui perché è mai una buona pratica di ciecamente ignora tutte le eccezioni. Sarete ignorando MemoryError, KeyboardInterrupt e SystemExit pure in caso contrario, che normalmente non si vuole ignorare o intercettare senza un qualche tipo di re-raise o ragione cosciente per la gestione di quelli.

+0

La gestione delle eccezioni di Python è così brutta, ti fa scrivere codice che grida per le macro in stile C. – Elazar

+3

@ Elazar: Quando il tuo codice inizia ad apparire come sopra, vuoi davvero ripensare a quello che stai facendo. Con i gestori di contesto e alcuni refactoring, la maggior parte del codice di gestione delle eccezioni può essere reso molto più leggibile e mantenibile. –

+0

La domanda è, dovrei ripensarlo solo perché è python quindi devo usare entrambe le eccezioni e il rientro. Quattro semplici operazioni, ognuna dovrebbe essere eseguita solo se l'ultimo non è riuscito e si ottengono 4 livelli di indentazione. uh. Se le eccezioni sono buone, il loro uso dovrebbe essere stato sintatticamente incoraggiato. – Elazar

3

estratto (refactoring) le sue dichiarazioni. E usa la magia di and e or per decidere quando fare un corto circuito.

def a(): 
    try: # a code 
    except: pass # or raise 
    else: return True 

def b(): 
    try: # b code 
    except: pass # or raise 
    else: return True 

def c(): 
    try: # c code 
    except: pass # or raise 
    else: return True 

def d(): 
    try: # d code 
    except: pass # or raise 
    else: return True 

def main(): 
    try: 
     a() and b() or c() or d() 
    except: 
     pass 
+1

'tranne: raise'? Che punto c'è in questo? L'eccezione cancellerà comunque il resto delle chiamate. –

+0

Viene commentato, dipende se vuole che continui o si fermi. –

+1

Penso che un decoratore si adatterebbe qui. – Elazar

1

Se non si desidera catena (un numero enorme di) tenta, tranne clausole, si può provare i tuoi codici in un ciclo e rompere sul primo successo.

Esempio con codici che possono essere messi in funzione:

for code in (
    lambda: a/b, 
    lambda: a/(b + 1), 
    lambda: a/(b + 2), 
    ): 
    try: print(code()) 
    except Exception as ev: continue 
    break 
else: 
    print("it failed: %s" % ev) 

Esempio con codici arbitrari (dichiarazioni) direttamente nell'ambito corrente:

for i in 2, 1, 0: 
    try: 
     if i == 2: print(a/b) 
     elif i == 1: print(a/(b + 1)) 
     elif i == 0: print(a/(b + 2)) 
     break   
    except Exception as ev: 
     if i: 
      continue 
     print("it failed: %s" % ev) 
Problemi correlati