【问题标题】:Python exception - need finally, don't need exceptPython 异常 - finally 需要,不需要 except
【发布时间】:2015-07-17 09:20:28
【问题描述】:

我有一些代码代表专有测试框架中的一个测试用例,看起来像这样:

def test_alarm(self):
    self.setup_some_test_data()
    try:
        self.send_alarm_message()
    except:
        print "Unexpected error:", sys.exc_info()
    finally:
        self.teardown_some_test_data()

我被告知放弃打印,因为它不是必需的,并且测试框架无论如何都会捕获任何异常,这比在这里捕获它们更可取,但我仍然需要始终清除数据,就像在finally 块。

我是否完全放弃 except 块?或者,如何构造代码以有效地拥有一个空的except 块并保留finally?这是 Python 中的良好做法还是有更好的方法?

编辑请注意,我确实尝试完全删除 except 块,并且我没有明显的运行时问题,尽管由于对 send_alarm_message() 的调用不太可能出现异常,所以它我不清楚如果抛出异常会如何工作,或者这是否被 Python 社区认为是好的做法。

【问题讨论】:

  • “我要完全放弃 except 块吗?” - 你为什么不试试呢?
  • @jonrsharpe 我试过了,没有明显的运行时问题,但由于不太可能出现异常,所以我不清楚如果抛出异常或是否考虑到它会如何工作Python 社区的良好实践。
  • 请注意,in the documentation 的某些示例不包括 except

标签: python exception-handling try-catch-finally try-finally


【解决方案1】:

要么删除 except 块,要么通过添加来真正改进它

except [Exception-Class]:
    pass

其中 [Exception-Class] 是要排除的异常。这增加了一些糖,因为真正意外的错误并没有被它捕获。 (或者单独添加:

except Exception, ex:
    print "Unexpected error:", ex

【讨论】:

    【解决方案2】:

    是的,您可以完全删除 except 块,只有 tryfinally 是有效的 Python 语法。示例 -

    In [58]: try:
       ....:     print("Blah")
       ....: finally:
       ....:     print("halB")
       ....:
    Blah
    halB
    

    请注意,这不会捕获try 块内发生的任何异常/错误,我猜这就是您想要的。

    我已经在很多地方看到过这种情况,我们正在创建一些变量/资源,无论是否发生任何异常/错误都需要清除,但我们不想在该特定位置处理任何异常。

    【讨论】:

      【解决方案3】:

      如果你不想在except 块中做任何事情,那么你可以pass 它。

      try:
          self.send_alarm_message()
      except:
          pass
      finally:
          self.teardown_some_test_data()
      

      【讨论】:

        猜你喜欢
        • 2012-11-16
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2022-11-09
        • 2011-04-21
        相关资源
        最近更新 更多