<p>如果您有一个长链或一个<em>动态</em>备选方案列表,您可能希望使用<code>for</code>循环:</p>
<pre><code>for func in funcs:
try:
aa = func()
break
except:
pass
else:
aa = 0
</code></pre>
<hr/>
<p>请注意,无论哪种方式,您可能都不真正想要一个空的<code>except</code>。通常情况下,您只希望出现某些特定的错误类别(例如<code>ValueError</code>或<code>LookupError</code>),其他任何错误都不应该意味着“默默地尝试下一个错误”,而是“向程序员显示出意外的错误”。但你知道怎么解决。你知道吗</p>
<hr/>
<p>如果需要重复使用,当然可以将其封装在函数中:</p>
<pre><code>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
</code></pre>
<hr/>
<p>当然,正如在注释中提到的,这确实要求您要尝试的所有内容都是无参数函数。如果您想尝试<code>spam(42)</code>,那么<code>eggs(beans)</code>如果失败了呢?或者不是函数调用而是其他表达式,比如<code>foo[bar]</code>?你知道吗</p>
<p>这与Python中出现的一般情况相同:第一种情况下使用<code>partial</code>绑定参数,第二种情况下使用<code>lambda</code>编写包装函数:</p>
<pre><code>result = try_funcs(partial(spam, 42), partial(eggs, beans), lambda: foo[bar])
</code></pre>
<hr/>
<p>但是,如果您只需要尝试静态的两个或三个备选方案,<a href="https://stackoverflow.com/a/27325699/908494">Simon Visser's simple nested answer</a>就更清楚了。你知道吗</p>
<hr/>
<p>如果你问<em>为什么</em>语言没有你的<code>tryelse</code>…好吧,我知道它在python ideas/-dev列表和其他地方出现过几次,并且已经讨论过了,所以你可能想搜索更详细/权威的答案。但我认为归根结底是这样的:虽然从理论上讲,用一个<code>tryelse</code>可以得到看起来更干净的例子,但任何人给出的每个例子要么都很好,要么显然应该被重构,因此没有令人信服的理由来更改语法、保留新关键字等等</p>