在if-else块中使用try-except

时间:2020-09-10 11:34:23

标签: python python-2.7 try-catch

我正在尝试在Python 2.7中执行以下操作:

if condition_a:
    try:
        b = func_1()
    except:
        b = func_2()
else:
    b = func_2()

是否有更好的方法编写此代码,从而避免两次出现b = func_2()行?我想尝试说一下,如果在try块中引发了异常,我们应该转到else块中的逻辑。

3 个答案:

答案 0 :(得分:0)

不是我最引以为豪的代码,但是没有更多的上下文,我想不出更干净的方法:

    <fragment
                android:id="@+id/nav_host_fragment_supervisor"
                android:name="androidx.navigation.fragment.NavHostFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_above="@+id/bottomNav"
                android:layout_below="@+id/appbar"
                app:defaultNavHost="true"
                app:navGraph="@navigation/navigation_graph_supervisor" />

答案 1 :(得分:0)

不是,不是。

无法提前测试异常(嗯,如果您可以事先检查其根本原因,则可以,但是假设您不能在此处进行测试)。所以你必须这样做。

它必须嵌套在if/else结构下的某个位置,最终看起来与您的示例非常相似。

至少对我来说,到目前为止给出的两个答案的意图都比您的代码要清楚得多。我不得不停下来思考一下在各种条件下代码执行流程可能会做什么以及为什么这样构造代码。

不要重复自己很重要-重复的代码通常是代码的味道。但是简单明了有其自身的优点。

Zen of Python quotes

简单胜于复杂。 可读性很重要。 错误绝不能默默传递。?

现在,也许您没有告诉我们整个故事,并且您有20个if-elif-elif-elif....else分支。也许不是真正的b = func_2(),而是20行重复的代码。

然后在发布该代码后,人们通常可以用字典替换大的选择,或者将重复的代码移到另一个函数中。

但是关于您最初的问题,我认为最好的方法是保持现状。

?现在,我知道您的是示例代码,但是我会改变一件事:


    try:
        b = func_1()
    except (<your expected exception>,):
        b = func_2()

拥有裸露的except :然后抑制异常的情况是一个巨大的沼泽,等待着您在Python中的第一个机会将您拖倒。它会咬你。这样做只是微不足道的事情,例如在代码中用非必要修饰异常消息-如果那行不通-只需跳过添加额外的信息即可。

答案 2 :(得分:-1)

您可以使用断言。

try:
    assert condition_a
    func_1()
except:
    func_2()