【问题标题】:Catch abstract exception and rethrow in concrete type in Java在Java中捕获抽象异常并以具体类型重新抛出
【发布时间】: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,恐怕你是对的,这是“不那么难看”的解决方案。让它丑陋的是我知道永远不会有任何其他具体类型的异常......但编译器不能断言:)
  • 您是否刚刚将抽象类添加到您的框架中?我的意思是...如果框架正在使用中,则必须立即运行。

标签: java exception-handling


【解决方案1】:

你可以试试下面这个:

public void handleThrowing() throws AbstractException {

//...

throw createException();

}

【讨论】:

  • 谢谢,是的,这是一种可能,但它对代码的影响太大了,包括我不维护的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2018-12-17
  • 2011-06-27
  • 2013-04-14
  • 2010-10-03
  • 2012-03-25
  • 1970-01-01
相关资源
最近更新 更多