在Java中捕获具体类型中的抽象异常和重定向
我的代码中有这样一种情况: 抽象的例外在Java中捕获具体类型中的抽象异常和重定向,java,exception-handling,Java,Exception Handling,我的代码中有这样一种情况: 抽象的例外 public abstract class AbstractException extends Exception { ... } 由3个具体的异常实现 public class ConcreteException1 extends AbstractException { // ... } public class ConcreteException2 extends AbstractException { // ... } pub
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);
}
我觉得维护起来不是很容易,有更好的方法吗
谢谢你的回答 您可以尝试以下方法:
public void handleThrowing() throws AbstractException {
//...
throw createException();
}
修复编译错误的方法(可能不是您想要的):声明
handleThrowing()
为public void handleThrowing()AbstractException
我一开始想这样做,但影响太大,包括其他应用程序使用的api,所以我无法更改此方法的签名。好吧,编译器是对的,无法保证createException()
只返回这三种类型中的一种,而不返回AbstractException
的任何其他可能的子类。因此,你必须告诉它如何处理这种可能性,而你的catch
-rethrow
解决方案正是如此。谢谢@Holger,恐怕你是对的,这是“不那么难看”的解决方案。让它难看的是我知道永远不会有任何其他具体类型的例外。。。但是编译器不能断言:)您是否只是将抽象类添加到了框架中?我是说。。。如果框架正在使用中,is必须立即运行。谢谢,是的,这是可能的,但它对代码有太大的影响,包括我不维护的部分。