【发布时间】:2015-06-05 09:39:33
【问题描述】:
我的代码中的情况如下所示:
一个抽象的异常
public abstract class AbstractException extends Exception {
...
}
由 3 个具体异常实现
public class ConcreteException1 extends AbstractException {
// ...
}
public class ConcreteException2 extends AbstractException {
// ...
}
public class ConcreteException3 extends AbstractException {
// ...
}
返回抽象异常实例的方法:
public AbstractException createException()
{
// create an exception that can be one of the 3 concrete class
}
然后在我的代码中,我有一个处理异常抛出的方法:
public void handleThrowing() throws ConcreteException1, ConcreteException2, ConcreteException3
{
//...
throw createException();
}
此代码无法编译,因为存在“未处理的异常类型 AbstractException”。
为了让它编译,我有义务这样做:
try
{
throw createException();
}
catch (ConcreteException1 | ConcreteException2 | ConcreteException3 ex)
{
throw ex;
}
catch (AbstractException e)
{
throw new IllegalStateException("Exception unknown", e);
}
我觉得它不是很容易维护,有没有更好的方法?
感谢您的回答!
【问题讨论】:
-
修复编译错误的方法(可能不是你想要的):将
handleThrowing()声明为public void handleThrowing() AbstractException -
一开始我想这样做,但是影响太大了,包括在其他应用程序使用的api中,所以我无法更改此方法的签名
-
好吧,编译器是对的,不能保证
createException()只返回这三种类型中的一种,而不是AbstractException的任何其他可能的子类。因此,您必须告诉它如何处理这种可能性,而您的catch- rethrow解决方案正是这样做的。 -
谢谢@Holger,恐怕你是对的,这是“不那么难看”的解决方案。让它丑陋的是我知道永远不会有任何其他具体类型的异常......但编译器不能断言:)
-
您是否刚刚将抽象类添加到您的框架中?我的意思是...如果框架正在使用中,则必须立即运行。