我在 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 块中的代码有问题。为方便起见,这是我的代码:
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
的块:
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
,否则你通常不想忽略或拦截,除非有某种重新加注或有意识的理由来处理这些KeyboardInterrupt
。SystemExit
你可以使用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
提取(重构)您的陈述。并使用 和 的魔力and
来or
决定何时短路。
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)
假设每个代码都是一个函数,并且它已经编写好了,那么以下代码可用于遍历您的编码列表并在使用“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('.'))。
你可以试试 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
这样,您可以循环任意数量的函数,而不会使代码看起来难看
我使用不同的方式,使用一个新变量:
continue_execution = True
try:
command1
continue_execution = False
except:
pass
if continue_execution:
try:
command2
except:
command3
要添加更多命令,您只需添加更多表达式,如下所示:
try:
commandn
continue_execution = False
except:
pass
就像 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
我遇到了这个问题,但后来它在一个循环中做这些事情,这把它变成了一个简单的例子,continue
如果成功则发出命令。我认为如果不在循环中,至少在某些情况下可以重用该技术:
while True:
try:
code_a
break
except:
pass
try:
code_b
break
except:
pass
etc
raise NothingSuccessfulError