一个块中有多个try代码

arv*_*urs 53 python exception-handling exception 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
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

Mar*_*ers 75

你必须制作这个单独的 try块:

try:
    code a
except ExplicitException:
    pass

try:
    code b
except ExplicitException:
    try:
        code c
    except ExplicitException:
        try:
            code d
        except ExplicitException:
            pass
Run Code Online (Sandbox Code Playgroud)

这是假设你想运行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
Run Code Online (Sandbox Code Playgroud)

我在except ExplicitException这里使用是因为盲目地忽略所有异常从来都不是一个好习惯.你会被忽略MemoryError,KeyboardInterrupt并且SystemExit还有否则,你通常不希望没有某种形式再次加注或意识理性处理那些无视或拦截.

  • @Elazar:当你的代码开始如上所示时,你真的想重新思考你在做什么.通过上下文管理器和一些重构,可以使大多数异常处理代码更具可读性和可维护性. (7认同)
  • 问题是,我是否应该重新考虑它,因为它是 python,所以我必须同时使用异常和缩进。四个简单的操作,每个操作仅在最后一个操作失败时才执行,并且您将获得 4 级缩进。呃。如果例外是好的,那么在语法上应该鼓励使用它们。 (3认同)
  • Python的异常处理非常丑陋,它使您编写了为C样式宏哭泣的代码。 (2认同)
  • OP中没有足够的细节来研究可能的替代方案. (2认同)
  • @naught101:这太宽泛了,无法提供像相关上下文管理器用法的链接这样集中的内容。我能想到的最好的是[Raymond Hettinger 的演讲,演示了使用上下文管理器的代码重构](https://www.youtube.com/watch?v=wf-BqAjZb8M)。 (2认同)

Mos*_*hri 14

你可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 为什么会有人用这个? (12认同)
  • @jfleach:因为它完全符合OP的要求。这很有趣。 (5认同)
  • 这会尝试每一个还是在第一个成功运行后停止? (3认同)
  • 正如 @Austin 在他的问题中评论的那样:这将尝试执行代码的每个部分。在第一次成功之后它不会停止。 (2认同)

Inb*_*ose 6

提取(重构)您的陈述。和使用魔法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
Run Code Online (Sandbox Code Playgroud)

  • 我认为装饰器适合这里。 (3认同)

kxr*_*kxr 5

如果您不想链接(大量)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)
Run Code Online (Sandbox Code Playgroud)

直接在当前范围内使用任意代码(语句)的示例:

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)
Run Code Online (Sandbox Code Playgroud)


Yes*_*esh 5

你可以尝试一个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
Run Code Online (Sandbox Code Playgroud)

这样你就可以循环任意数量的函数,而不会让代码看起来很难看