如果你有其中任一长链,或替代的动态列表中,您可能需要使用一个for
循环:
for func in funcs:
try:
aa = func()
break
except:
pass
else:
aa = 0
注意,无论哪种方式,你可能不要't 真的想要一个光秃的except
在这里。通常你只希望发现一些特定类型的错误(例如,ValueError
或LookupError
),其他任何东西都不应该意味着“默默地尝试下一个错误”,而是“向程序员显示意外出错的东西”。但你知道如何解决这个问题。
你当然可以换行了一个功能,如果你需要反复使用它:
def try_funcs(*funcs, defval=0, ok_exceptions=Exception):
for func in funcs:
try:
return func()
except ok_exceptions: # ok_exceptions can also be a tuple of exception classes.
pass
return defval
当然,作为在评论中提到的,这的确需要一切你想尝试成为没有参数的函数。如果你想尝试spam(42)
,那么eggs(beans)
如果失败了怎么办?或者甚至不是函数调用,而是其他表达式,如foo[bar]
?
这是一样的出现各地的Python一般情况下:您使用partial
在议论同lambda
绑定对于第一种情况,或者写一个包装函数第二:
result = try_funcs(partial(spam, 42), partial(eggs, beans), lambda: foo[bar])
但是,如果你只是有一个静态的两个或三个替代品尝试,Simon Visser's simple nested answer是更清晰。
如果你问为什么的语言没有你tryelse
......嗯,我知道它拿出蟒思路/ -dev列表和其他地方几十倍,并进行了讨论,所以你可能想要搜索更详细/权威的答案。但我认为可以归结为以下几点:尽管理论上有可能提出一个可能看起来更干净的案例,但每个人所给出的每个示例都可以是现在的样子,或者显然应该被重构,因此没有任何令人信服的理由更改语法,保留新的关键字等。
第二种解决方案很尴尬。它不会减少缩进,也使得只有在'foo'失败时才想尝试'bar'才不那么明显。第一个解决方案+1(又名正确的方法:) – iCodez 2014-12-05 22:31:03
我不打算像你这样有两个以上的破解函数,但出于好奇,如果我有五个或十个不同的易碎函数我想要这个功能? – 2014-12-05 22:34:49
@StevenRogers:您可以将所有函数添加到列表中,遍历列表并通过try/call调用每个函数。一旦第一个函数成功给你一个值,你就会立即跳出循环。 – 2014-12-05 22:37:57