Java:声明可以抛出异常的接口方法的正确方法是什么?

Dav*_*e H 5 java osgi exception-handling

假设我有这个由多个供应商实现的接口A:

interface A
{
    void x();
    void y();
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望供应商能够抛出异常来发出信号失败的信号,并且可能会抛出一个方法RuntimeException.在每种情况下,调用这些方法的代码都应该处理失败并继续.仅仅因为1个供应商抛出NPE,我不希望系统崩溃.我想通过将每个方法声明为:来确保每个调用都能捕获所有异常,而不是将其留给调用方法的人(或者真正的维护方式).

void x() throws Exception;
Run Code Online (Sandbox Code Playgroud)

但这通常是不好的做法(PMD不喜欢它,一般我同意具体方法的规则),所以我想这是规则的例外还是有更好的方法?

让我说清楚,我正在寻找一种解决方案,其中接口的调用者被迫处理所有异常(包括RuntimeExceptions).

为了进一步详细说明我的环境,所有这些都在OSGi框架内运行.因此,每个供应商将其代码打包在一个捆绑包中,OSGi将处理所有异常以防止整个系统崩溃.我真正关注的是OSGi服务接口,它将被某些核心捆绑包调用.我想要确定的是,当我遍历所有服务时,一个服务不会抛出NPE并停止正在执行的进程.我希望通过捕获从服务抛出的所有异常来更优雅地处理它,以便仍然管理其他提供的服务.

Coo*_*ans 7

创建自己的异常类即.MySeviceException并从界面中抛出它.这里的想法是抛出有意义的异常,所以如果为您的目的提供最大的可读性和可维护性,不要害怕创建许多自定义异常类.您可以在下游捕获供应商详细的异常并将它们包装为您的自定义异常,以便上游流不必处理特定于供应商的异常.

class MySeviceException extends Exception{
    public MySeviceException() {}  
    public MySeviceException(String msg) { super(msg); }  
    public MySeviceException(Throwable cause) { super(cause); }  
    public MySeviceException(String msg, Throwable cause) { super(msg, cause); } 
}

interface A
{
    void x() throws MySeviceExceptionException;
    void y() throws MySeviceExceptionException;
}
Run Code Online (Sandbox Code Playgroud)

作为一个经验永远不会抓住Errors,总是捕捉Exceptions和处理它!

  • @Dave H - 您不能(也不应该尝试)强制调用者检查RuntimeExceptions,这是未经检查的异常的性质. (4认同)