2013-06-26 2 views
21

У меня проблема с моим кодом в блоке 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 

ли что-то подобное возможно?

+1

Чтобы быть явным, вы хотите 'код c' для выполнения * только тогда, когда код b вызывает исключение *? –

+0

Все коды должны запускаться в одном блоке try, даже если они создают исключение. – arvidurs

+0

Этого не может быть. Блока 'try' не существует для исключения исключений во всем исполняемом коде. Это позволит вам * catch * исключение, когда это произойдет, но остальная часть блока никогда не выполняется. –

ответ

30

Вы должны будете сделать это отдельныхtry блоков:

try: 
    code a 
except ExplicitException: 
    pass 

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

Это предполагает, что вы хотите запустить code cтолько если code b не удался.

Если вам нужно запустить code cнезависимо, вы должны поместить try блоки один за другим:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    pass 

try: 
    code c 
except ExplicitException: 
    pass 

try: 
    code d 
except ExplicitException: 
    pass 

Я использую except ExplicitException здесь, потому что это никогда не хорошая практика, чтобы слепо игнорировать все исключения. Вы будете игнорировать MemoryError, KeyboardInterrupt и SystemExit, а также в противном случае, которые вы обычно не хотите игнорировать или перехватывать без какого-либо повторного рейза или осознанной причины для их обработки.

+0

Обработка исключений Python настолько уродлива, что вы заставляете писать код, который плачет для макросов в стиле C. – Elazar

+3

@ Elazar: Когда ваш код начинает выглядеть так, вы действительно хотите переосмыслить то, что вы делаете. С менеджерами контекста и некоторым рефакторингом большинство кода обработки исключений можно сделать гораздо более удобочитаемыми и удобными. –

+0

Вопрос в том, должен ли я переосмыслить его только потому, что это python, поэтому я должен использовать оба исключения и отступы. Четыре простых операции, каждая из которых должна выполняться только в том случае, если последний не выполнен, и вы получаете 4 уровня отступов. э. Если исключения хороши, их использование должно быть синтаксически поощрено. – Elazar

3

Извлеките (рефакторинг) свои заявления. И используйте магию and и or, чтобы решить, когда короткозамкнуто.

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

'кроме: поднять'? Какой смысл в этом? Исключение будет по-прежнему отменять остальные вызовы. –

+0

Прокомментировано, зависит, хочет ли он продолжать или останавливаться. –

+1

Я думаю, что декоратор подойдет здесь. – Elazar

1

Если вы не хотите, чтобы цепь (огромное количество) примерочных, за исключением положений, вы можете попробовать свои коды в петлю и обрушиться на 1-й успех.

Пример с кодами, которые могут быть введены в функции:

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) 

Пример с произвольными кодами (заявления) непосредственно в текущей области:

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)