Python 一个块中有多个try代码

Python 一个块中有多个try代码,python,exception,exception-handling,try-catch,except,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 这样做可能吗?您必须将此设置为单独的尝试块: try: code a except ExplicitException: pass try: code

我在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
这样做可能吗?

您必须将此设置为单独的
尝试
块:

try:
    code a
except ExplicitException:
    pass

try:
    code b
except ExplicitException:
    try:
        code c
    except ExplicitException:
        try:
            code d
        except ExplicitException:
            pass
这假设只有在
代码b
失败时,您才想运行
代码c

如果需要运行
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
我在这里使用的是
除了ExplicitException
,因为盲目忽略所有异常是绝不的好做法。您将忽略
内存错误
键盘中断
系统退出
,否则,您通常不希望忽略或拦截这些错误,而无需重新提出或有意识地处理这些错误。

提取(重构)语句。并使用
来决定何时短路

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

如果您不想链接(大量)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)
您可以使用模块。
使用
@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

假设每个代码都是一个函数,并且已经编写好了,那么可以使用下面的代码通过您的编码列表进行iter,并在使用“break”无误地执行函数时退出for循环

def a():代码a
def b():代码b
def c():代码c
def d():代码d
对于[a、b、c、d]中的func:#更改列表顺序以更改执行顺序。
尝试:
func()
打破
除异常作为错误外:
打印(错误)
持续

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

您可以尝试使用for循环


对于zip中的func、args、kwargs([a、b、c、d],
[args_a,args_b,args_c,args_d],
[kw_a,kw_b,kw_c,kw_d]):
尝试:
func(*args,**kwargs)
打破
除:
通过

通过这种方式,您可以循环任意多个函数,而不会使代码看起来很难看

我使用另一种方式,使用一个新变量:

continue_execution = True
try:
    command1
    continue_execution = False
except:
    pass
if continue_execution:
    try:
        command2
    except:
        command3
要添加更多命令,只需添加更多表达式,如下所示:

try:
    commandn
    continue_execution = False
except:
    pass

我认为装饰师适合这里。如果
b
失败(引发异常),
c
将不会执行,也不会执行
d
。它被注释,只是作为注释存在…也可以编写
pass
…编辑它,更好吗?好吧,这就是我的想法,对于每个代码,我必须创建一个新的try块。因为假设我有几个代码要运行,即使出现异常,它也应该继续。Becau它现在做什么,当第一个异常发生时,当B失败时,它将跳过其他代码。这不是我想要的。即使B失败,它也应该尝试C,如果C失败,它应该尝试D。无论是否出错,它都应该贯穿所有行。希望现在更好地理解。
除了:pass…else:return True
是一种模糊的im方式正确地说
except:return None…else:return True
。最好是显式的。显式地说,您希望
code c
仅在代码b引发异常时执行?所有代码都应该在一个try块中运行,即使它们引发异常。您不能这样做。
try
块不是用来抑制异常的在所有执行的代码中。当异常发生时,它会让您捕获异常,但块的其余部分永远不会执行。好吧,很高兴知道。因此,每一个代码尝试一次blockPython的异常处理是如此丑陋,它使您编写的代码需要C风格的宏。@Elazar:当您的代码开始像上面那样时,您真的想重新思考一下你正在这么做。通过上下文管理器和一些重构,大多数异常处理代码可以变得更具可读性和可维护性。问题是,我是否应该重新考虑它,仅仅因为它是python,所以我必须同时使用异常和缩进。四个简单的操作,每个操作应该仅在最后一个操作失败时执行,并且您可以获得4级缩进ion.嗯。如果例外情况是好的,那么它们的使用应该在语法上得到鼓励。OP中没有足够的细节来探讨可能的替代方案。@NOTT101:这是一种方式,太广泛了,无法提供任何与上下文管理器使用相关的链接。我能想到的最好的方式是。这会尝试每一种方式还是在第一次之后停止成功运行?为什么会有人使用它?@jflech:因为它正是OP要求的。而且很有趣。将它们作为函数列表(已经调用)将立即在列表中执行它们,甚至在到达
try