Подтвердить что ты не робот

Несколько кодов try в одном блоке

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

Возможно ли подобное?

4b9b3361

Ответ 1

Вам нужно будет сделать этот отдельный блок 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, которые вы обычно не хотите игнорировать или перехватывать без какого-либо повторного рейза или осознанной причины для их обработки.

Ответ 2

Извлеките (рефакторинг) свои заявления. И используйте магию 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

Ответ 3

Если вы не хотите цепочки (огромное количество) предложений try-except, вы можете попробовать свои коды в цикле и прервать 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)