引发接口中未定义的异常

2022-09-03 05:53:27

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

下面是一个示例:

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 {}
}

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


另一个有趣的情况是涉及一个你无法控制的界面。在这种情况下,指示问题已发生的最佳方法是什么?

为了便于说明,下面是另一个示例:

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

public class CupcakeReader implements Reader
{
    public void read() throws CupcakeException {}
}

在这种情况下,您无法更改 Reader,但您希望指示 CupcakeReader读取方法中发生了问题。


答案 1

您可能必须改为创建预期类型的例外。

... catch(CupcakeException e) {
   throw new IOException("The sky is falling", e);
 }

答案 2

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