为什么 OSGI 捆绑激活器方法使用 "throws Exception" 声明?



OSGI BundleActivator的startstop方法都用throws Exception声明。与此同时,Joshua Bloch在其著作《高效Java,第二版,第62项》中说

永远不要声明方法"抛出异常"

那么,在BundleActivator中,这是一个糟糕的设计决策,还是这种普遍性在这种情况下是合理的?为什么?

请注意,您可以在不使用任何throws子句的情况下声明startstop方法。(或者您可以用任何java.lang.Exception子类声明这些方法。)

另一方面,特定的,例如

void start(BundleContext context) throws BundleActivatorException

方法不会有太大改变。它只会让实现者捕获他们的异常,并重新将其封装在BundleActivatorException中。由于每个异常都会使bundle激活变得毫无意义,所以这个try-catch块实际上是不必要的,所以抛出java.lang.Exception更容易。

start()stop()方法抛出异常表示出现了严重错误,不应进行捆绑包生命周期更改。由于我们将检测情况(通过bundle)和处理情况(通过框架)的关注点分开,抛出Exception是唯一合理的做法。

我认为Josh Bloch的建议不合时宜。throws Exception没有任何问题。它让你可以选择抛出任何你喜欢的异常,OSGi框架会处理它

请注意,您永远不需要自己调用这些方法。

最新更新