更好的方法使用try除了块

时间:2015-07-01 06:55:46

标签: python try-except

我需要执行多个Python语句,其中很少一些可能在执行期间失败,即使在失败之后我也希望执行其余的语句。

目前,我正在做:

try:
    wx.StaticBox.Destroy()
    wx.CheckBox.Disable()
    wx.RadioButton.Enable()
except:
    pass

如果任何一个语句失败,except将被执行并退出程序。但我需要的是即使它失败了它应该运行所有三个语句。

我怎样才能在Python中执行此操作?

3 个答案:

答案 0 :(得分:6)

对要调用的方法使用for循环,例如:

for f in (wx.StaticBox.Destroy, wx.CheckBox.Disable, wx.RadioButton.Enable):
    try:
        f()
    except Exception:
        pass

请注意,我们在这里使用except Exception - 这通常比你想要的更有可能。

答案 1 :(得分:4)

如果在try块期间发生异常,则跳过块的其余部分。您应该为三个单独的语句使用三个单独的try子句。

在回复评论时添加:

由于您显然希望处理许多语句,因此可以使用包装器方法来检查异常:

def mytry(functionname):
    try:
        functionname()
    except Exception:
        pass

然后使用函数名称作为输入调用方法:

mytry(wx.StaticBox.Destroy)

答案 2 :(得分:-1)

我建议创建一个上下文管理器类来抑制任何异常和要记录的异常。

请查看下面的代码。会鼓励任何改进。

import sys
class catch_exception:
    def __init__(self, raising=True):
        self.raising = raising

    def __enter__(self):
        pass

    def __exit__(self, type, value, traceback):
        if issubclass(type, Exception):
            self.raising = False

        print ("Type: ", type, " Log me to error log file")
        return not self.raising



def staticBox_destroy():
    print("staticBox_destroy")
    raise TypeError("Passing through")

def checkbox_disable():
    print("checkbox_disable")
    raise ValueError("Passing through")

def radioButton_enable():
    print("radioButton_enable")
    raise ValueError("Passing through")


if __name__ == "__main__":
    with catch_exception() as cm:
        staticBox_destroy()
    with catch_exception() as cm:
        checkbox_disable()
    with catch_exception() as cm:
        radioButton_enable()