【问题标题】:Better way to use try except block使用 try except 块的更好方法
【发布时间】:2015-09-18 04:56:35
【问题描述】:

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

目前,我正在做:

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

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

如何在 Python 中做到这一点?

【问题讨论】:

  • 如果其中任何一个因为失败而无法运行,它怎么可能运行所有 3 个?
  • 1.不要直接使用except至少使用except Exception。 2. 如果这些语句应该(或不)独立执行,将它们放在单独的try 块中!
  • @TimCastelijns 我猜他的意思是他们都应该尝试。
  • 每个语句(在您的实际代码中)是否调用了方法?

标签: python try-except


【解决方案1】:

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

为回应评论添加:

由于您显然想要处理许多语句,您可以使用包装方法来检查异常:

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

然后以你的函数名作为输入调用方法:

mytry(wx.StaticBox.Destroy)

【讨论】:

  • 我只是举了一个例子作为3个语句。实时我有超过 12 条语句。 12 尝试 except 程序中的块看起来不太好。
  • @Arunkumar 在这种情况下,使用包装方法。查看我的编辑,我将在稍后进行。
  • @Arunkumar 那么你需要 "more than 12" 个块,或者重构为一个循环。如果您使用的是 Python 3.4,则可以使用 contextlib.suppress 来整理代码。
  • mytry 似乎有点受限;至少,允许它把要抑制的错误作为参数(默认仍然可以是Exception)。
  • 文件 "C:\Python27\lib\site-packages\wx-3.0-msw\wx_core.py",第 16712 行,在 getattr 中引发 PyDeadObjectError(self.attrStr % self._name) wx._core.PyDeadObjectError: TextCtrl 对象的 C++ 部分已被删除,不再允许属性访问。
【解决方案2】:

在您希望调用的方法上使用for 循环,例如:

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

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

【讨论】:

    【解决方案3】:

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

    请看下面的代码。将鼓励对其进行任何改进。

    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()
    

    【讨论】:

    • 哦...。请立即阅读stackoverflow.com/editing-help,我什至没有碰它。
    • 我已经修复了格式。抱歉,第一次使用堆栈。感谢您的链接。
    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多