У меня есть ситуация в моем коде, который выглядит следующим образом:Поймайте абстрактное исключение и Rethrow в конкретном типе в Java
Абстрактного Исключение
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()' ', как общественное ничтожной handleThrowing() AbstractException' –
Я хотел сделайте это сначала, но есть так много влияния, в том числе в api, которые используются другим приложением, поэтому я не могу изменить подпись этого метода. – aurya
Ну, компилятор прав, нет гарантии, что 'createException()' возвращает только один из этих трех типов, а не любой другой возможный подкласс «AbstractException». Поэтому вы должны сказать, как справиться с этой возможностью, и ваше решение 'catch'-re'throw' делает именно это. – Holger