【问题标题】:Why OSGI BundleActivator methods are declared with "throws Exception"?为什么 OSGI BundleActivator 方法被声明为“抛出异常”?
【发布时间】:2012-03-07 21:17:27
【问题描述】:
OSGI BundleActivator 的start 和stop 方法都用throws Exception 声明。与此同时,Joshua Bloch 在他的《Effective Java, Second Edition, Item 62》一书中说
从不声明方法“抛出异常”
那么在BundleActivator 中这是一个糟糕的设计决策,或者在这种情况下这种概括是合理的,为什么?
【问题讨论】:
标签:
java
exception
osgi
throws
【解决方案1】:
请注意,您可以在没有任何 throws 子句的情况下声明您的 start 和 stop 方法。 (或者您可以使用任何java.lang.Exception 子类声明这些方法。)
另一方面,具体的,例如
void start(BundleContext context) throws BundleActivatorException
方法不会改变太多。它只会让实现者捕获他们的异常并将其重新抛出包裹在BundleActivatorException 中。由于每个异常都会使包激活变得毫无意义,因此这个 try-catch 块确实是不必要的,因此抛出 java.lang.Exception 更容易。
【解决方案2】:
从start() 或stop() 方法中抛出异常表明存在严重错误,并且不应进行捆绑生命周期更改。由于我们将检测情况(通过包)和处理(通过框架)的关注点分开,所以抛出Exception 是唯一合理的做法。
【解决方案3】:
我认为 Josh Bloch 的建议不合时宜。 throws Exception 没有任何问题。它使您可以选择抛出任何您喜欢的异常,OSGi 框架会处理它。
请注意,您永远不需要自己调用这些方法。