【发布时间】:2010-11-16 10:16:45
【问题描述】:
当您需要抛出未在您正在实现的接口中定义的异常时,最佳做法是什么?
这是一个例子:
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并没有在它的接口中定义这种类型的异常,那你怎么办呢?此外,在 Reader 接口的 throws 子句中添加 CupcakeException 是没有意义的,因为这种类型的异常是特定于 CupcakeReader。解决这个问题的一种方法是让 Reader 定义 read 以便它抛出一些父类型,例如 Exception,但随后您会丢失例外。在这种情况下你应该怎么做?谢谢!
另一个有趣的情况涉及一个您无法控制的界面。在这种情况下,表明出现问题的最佳方式是什么?
为了便于说明,这里是另一个例子:
public interface Reader
{
public abstract void read();
}
public class CupcakeReader implements Reader
{
public void read() throws CupcakeException {}
}
在这种情况下,您无法更改 Reader,但您想表明 CupcakeReader 的 read 方法出现问题。
【问题讨论】:
-
这比我想象的还要糟糕。这样你甚至不能使用链接来规避系统。我认为你必须求助于(哎哟!)
RuntimeExceptions。 -
我使用了 System.err.println 和 exception.printStackTrace();。这是合适的,还是应该像你说的那样用 RuntimeExecption 传播错误?
-
我认为 log+swallow 在 99.99% 的情况下都不合适。由于这里提出的问题,这是 Java 开发人员中常见的(反?)模式。在我的“思想流派”中,只有三种有效的处理异常的方法:重新抛出、处理(即修复问题)或让它冒泡给可以处理它的人。永远不要吞咽。万一出了差错,后果自负。
-
免责声明:这是我个人的观点。我认识一些人认为吞咽是可以接受的(我一直不明白为什么)。
标签: java exception interface throw