2013-06-26 17 views
21

Mam problem z moim kodem w bloku try. Aby ułatwić to mój kod:Wiele kodów prób w jednym bloku

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 

Czy coś takiego jest możliwe?

+1

być jawne, chcesz 'Kod C' do wykonania * tylko wtedy, gdy kod b zgłasza wyjątek *? –

+0

Wszystkie kody powinny być uruchamiane w jednym bloku try, nawet jeśli podnoszą wyjątek. – arvidurs

+0

Nie możesz tego mieć. Blok "try" nie służy do tłumienia wyjątków we wszystkich wykonywanych kodach. Pozwoli ci to * złapać * wyjątek, kiedy to się stanie, ale reszta bloku nigdy nie zostanie wykonana. –

Odpowiedz

30

Musisz zrobić to oddzielnetry bloki:

try: 
    code a 
except ExplicitException: 
    pass 

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

Zakłada chcesz uruchomić code ctylko jeśli code b powiodło się.

Jeśli trzeba uruchomić code cniezależnie, trzeba umieścić try bloki jeden po drugim:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    pass 

try: 
    code c 
except ExplicitException: 
    pass 

try: 
    code d 
except ExplicitException: 
    pass 

Używam except ExplicitException tutaj, ponieważ jest nigdy dobra praktyka, aby ślepo zignoruj ​​wszystkie wyjątki. Zignorujesz także: MemoryError, ,i SystemExit, w przeciwnym razie, które normalnie nie chcesz ignorować ani przechwytywać bez pewnego rodzaju ponownego podniesienia lub świadomego powodu do ich obsługi.

+0

Obsługa wyjątków w Pythonie jest po prostu brzydka, to powoduje, że piszesz kod, który wyłapuje makra w stylu C. – Elazar

+3

@Elazar: Kiedy twój kod zaczyna wyglądać jak powyżej, naprawdę chcesz przemyśleć to, co robisz. Dzięki menedżerom kontekstów i pewnym refaktoryzacjom, większość kodów obsługi wyjątków może być znacznie bardziej czytelna i możliwa do utrzymania. –

+0

Pytanie brzmi, czy powinienem przemyśleć to tylko dlatego, że jest python, więc muszę użyć zarówno wyjątków, jak i wcięć. Cztery proste operacje, z których każda powinna być wykonywana tylko wtedy, gdy ostatnia nie powiodła się, a otrzymasz 4 poziomy wcięć. uh. Jeśli wyjątki są dobre, należy ich zachęcić syntaktycznie. – Elazar

3

Wyciąg (refaktor) swoje wypowiedzi. I użyj magii and i or, aby zdecydować, kiedy się zwierać.

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

'except: raise'? Jaki jest w tym sens? Wyjątek będzie nadal anulować pozostałe połączenia. –

+0

To jest skomentowane, zależy, czy chce go kontynuować, czy zatrzymać. –

+1

Myślę, że pasowałby tu dekorator. – Elazar

1

Jeśli nie chcesz łańcucha (ogromnej liczby) spróbować z wyjątkiem klauzul, można spróbować swoich kodów w pętlę i rozbić na 1st sukcesu.

Przykład z kodami, które mogą być wprowadzane do funkcji:

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) 

Przykład z dowolnych kodów (sprawozdania) bezpośrednio w bieżącym zakresie:

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)