105

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

这样的事情可能吗?

4

9 回答 9

162

您必须制作这些单独 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,否则你通常不想忽略或拦截,除非有某种重新加注或有意识的理由来处理这些KeyboardInterruptSystemExit

于 2013-06-26T14:03:11.453 回答
39

你可以使用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
于 2018-04-26T21:03:34.960 回答
16

提取(重构)您的陈述。并使用 和 的魔力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
于 2013-06-26T14:04:21.007 回答
6

如果您不想链接(大量)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)
于 2017-03-23T16:00:08.273 回答
4

假设每个代码都是一个函数,并且它已经编写好了,那么以下代码可用于遍历您的编码列表并在使用“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

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

于 2019-12-23T23:02:56.640 回答
3

你可以试试 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

这样,您可以循环任意数量的函数,而不会使代码看起来难看

于 2020-01-22T03:20:33.183 回答
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
于 2021-05-28T12:29:18.123 回答
0

就像 Elazar 建议的那样:“我认为这里适合装修。”

# decorator
def test(func):
    def inner(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except: pass
    return inner

# code blocks as functions
@test
def code_a(x):
    print(1/x)

@test
def code_b(x):
    print(1/x)

@test
def code_c(x):
    print(1/x)

@test
def code_d(x):
    print(1/x)

# call functions
code_a(0)
code_b(1)
code_c(0)
code_c(4)

输出:

1.0
0.25
于 2022-01-13T14:23:01.573 回答
0

我遇到了这个问题,但后来它在一个循环中做这些事情,这把它变成了一个简单的例子,continue如果成功则发出命令。我认为如果不在循环中,至少在某些情况下可以重用该技术:

while True:
    try:
        code_a
        break
    except:
        pass

    try:
        code_b
        break
    except:
        pass

    etc

    raise NothingSuccessfulError
于 2021-10-27T14:26:52.647 回答