2015-06-05 2 views
3

У меня есть ситуация в моем коде, который выглядит следующим образом:Поймайте абстрактное исключение и 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); 
    } 

Я не нахожу его очень легко поддерживать, есть лучший способ сделать?

Благодарим за ответы!

+0

способ исправить ошибку компиляции (возможно, не совсем то, что вы хотите): объявить 'handleThrowing()' ', как общественное ничтожной handleThrowing() AbstractException' –

+0

Я хотел сделайте это сначала, но есть так много влияния, в том числе в api, которые используются другим приложением, поэтому я не могу изменить подпись этого метода. – aurya

+2

Ну, компилятор прав, нет гарантии, что 'createException()' возвращает только один из этих трех типов, а не любой другой возможный подкласс «AbstractException». Поэтому вы должны сказать, как справиться с этой возможностью, и ваше решение 'catch'-re'throw' делает именно это. – Holger

ответ

0

Вы можете попробовать ниже один:

public void handleThrowing() throws AbstractException { 

//... 

throw createException(); 

} 
+1

Спасибо, да, это возможность, но это слишком сильно влияет на код, включая части, которые я не поддерживаю. – aurya

Смежные вопросы