一个块中有多个try代码

时间:2013-06-26 14:00:13

标签: python exception exception-handling try-catch except

我在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

这样的事情可能吗?

7 个答案:

答案 0 :(得分:57)

您必须制作单独的 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因为从不是盲目忽略所有异常的好习惯。你也会忽略MemoryErrorKeyboardInterruptSystemExit,否则你通常不想忽视或拦截,如果没有某种重新提升或有意识的处理原因。

答案 1 :(得分:8)

您可以使用fuckit模块 使用@fuckit装饰器

将代码包装在函数中
@fuckit
def func():
    code a
    code b #if b fails, it should ignore, and go to c.
    code c #if c fails, go to d
    code d

答案 2 :(得分:5)

提取(重构)你的陈述。并使用andor的魔力来决定何时短路。

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 :(得分:1)

如果您不想链接(大量)try-except子句,您可以循环尝试您的代码并在第一次成功时中断。

可以放入函数的代码示例:

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)

答案 4 :(得分:1)

您可以尝试for循环


for func,args,kwargs in zip([a,b,c,d], 
                            [args_a,args_b,args_c,args_d],
                            [kw_a,kw_b,kw_c,kw_d]):
    try:
       func(*args, **kwargs)
       break
    except:
       pass

这样,您可以在不使代码看起来丑陋的情况下循环任意数量的函数

答案 5 :(得分:1)

我使用不同的方式,使用一个新变量:

continue_execution = True
try:
    command1
    continue_execution = False
except:
    pass
if continue_execution:
    try:
        command2
    except:
        command3

要添加更多命令,您只需添加更多这样的表达式:

try:
    commandn
    continue_execution = False
except:
    pass

答案 6 :(得分:0)

让我们说每个代码都是一个函数,并且已经编写了代码,然后可以使用以下代码遍历您的编码列表,并在使用“ break”执行函数而没有错误的情况下退出for循环。

def a(): code a
def b(): code b
def c(): code c
def d(): code d

for func in [a(), b(), c(), d()]:  # change list order to change execution order.
   try:
       func 
       break
   except Exception as err:
       print (err)
       continue

我在这里使用了“ Exception”,因此您可以看到打印的任何错误。如果您知道会发生什么并且不在乎(例如,如果代码返回两个或三个列表项(i,j = msg.split('。')),请关闭打印。