Python 异常 - finally 需要,不需要 except

Python exception - need finally, don't need except

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

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 中的良好做法还是有更好的方法?

Edit 请注意,我确实尝试过完全删除 except 块,但我没有明显的 运行-time 问题,尽管因为例外是在对 send_alarm_message() 的调用中不太可能,我不清楚如果抛出异常它将如何工作,或者这是否被 Python 社区认为是好的做法。

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

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

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

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

请注意,这不会捕获 try 块中出现的任何 Exceptions/Errors,我猜这就是您想要的。

我已经在很多地方看到过这种用法,我们正在创建一些 variables/resources,无论是否发生任何 exceptions/errors 都需要清除,但我们不想处理任何异常在那个特定的地方。

要么删除 except 块,要么通过添加

来改进它
except [Exception-Class]:
    pass

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

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