Python 一个块中有多个try代码
我在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:
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