抛出接口中未定义的异常

Sco*_*ott 16 java interface exception throw

当您需要抛出未在您正在实现的接口中定义的异常时,要遵循的最佳实践是什么?

这是一个例子:

public interface Reader
{
    public abstract void read() throws IOException;
}

public class CarrotReader implements Reader
{
    public void read() throws IOException {}
}

public class CupcakeReader implements Reader
{
    public void read() throws IOException, CupcakeException {}
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您在阅读纸杯蛋糕时会发生特定的异常,因此您希望抛出与此相关的异常.但是,Reader没有在其界面中定义此类异常,那么您如何做?此外,将CupcakeException添加到Reader接口中的throws子句没有意义,因为这种类型的异常特定于CupcakeReader.解决这个问题的一种方法是让Reader定义read,使其抛出一些父类型,如Exception,但是你会丢失异常的上下文.在这种情况下你应该怎么做?谢谢!


已经提出的另一个有趣的情况涉及一个你无法控制的界面.在这种情况下,表明问题发生的最佳方法是什么?

为了便于说明,这是另一个例子:

public interface Reader
{
    public abstract void read();
}

public class CupcakeReader implements Reader
{
    public void read() throws CupcakeException {}
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您无法更改Reader,但您想表明CupcakeReaderread方法中出现了问题.

Tho*_*sen 13

您可能必须创建预期类型的​​例外.

... catch(CupcakeException e) {
   throw new IOException("The sky is falling", e);
 }
Run Code Online (Sandbox Code Playgroud)

  • @Scott,然后调用代码可以捕获IOException,如果存在原因,则使用THAT代替.您无法通过界面对更多已检查的异常施加压力而无需更改它.接口是_contract_. (2认同)

Sri*_*ddi 9

使用名为ReaderException的东西,它将作为异常层次结构的根接口.ReaderException还将提供指向由于较低级别异常而引发的其他异常的链接.

  • 这与cathching Exception不同.实际上,我会将异常调用为异常,因为你最终无意中捕获了其他运行时异常.例如,如果发生一个,那么catch块也会收到NPE.调用代码对捕获和处理这些代码不感兴趣.因此,使用您自己的异常层次结构是正确的方法.客户端有能力挑选并选择捕获正确的异常并进行适当的处​​理(如果他愿意的话) (3认同)