不是真的,不。
无法提前测试异常(好吧,如果您可以提前检查其根本原因,则可以,但我们假设您不能在这里)。所以你必须这样做。
它必须嵌套在 if/else 构造下的某个地方,并且最终看起来很像您的示例。
至少对我而言,到目前为止给出的两个答案的意图都比您的代码清楚得多。我不得不停下来想一想代码执行流程在各种条件下可能会做什么,以及为什么代码是这样构造的。
不要重复自己很重要 - 重复的代码通常是一种代码味道。但是简单明了有它自己的优点。
Zen of Python quotes:
简单胜于复杂。
可读性很重要。
错误永远不应该默默地过去。?
现在,也许你没有告诉我们整个故事,你有 if-elif-elif-elif....else 的 20 个分支。或者可能不是真正的b = func_2(),而是 20 行重复代码。
然后发布该代码,人们通常可以用字典替换类似的大选择,或者可以将重复的代码移动到另一个函数。
但关于您最初的问题,我认为最好的方法是保持原样。
? 现在,我知道您的代码是示例代码,但我要更改一件事:
try:
b = func_1()
except (<your expected exception>,):
b = func_2()
拥有一个裸露的except : 然后抑制异常是一个巨大的沼泽等待在Python 中一有机会就拖累你。它会咬你。只做一些琐碎的事情,比如在代码中装饰异常消息——如果这不起作用——就跳过添加额外的信息。