2014-09-03 3 views
2

Иногда я reclass исключения вроде этого:Перерасчет исключений хорошая практика?

try{ 
    methodA(param1); 
}catch(ExceptionType1 ex){ 
    throw new ExceptionType2(ex); 
} 

Примера, когда я делаю это, когда PARAMS Methoda должен быть безопасным и не будет бросать исключение, поэтому ExceptionType1 действительно свидетельствует о другой проблеме (что-то вроде ExceptionType2).

Это не переклассификация из проверенного исключения в непроверенную.

+0

Если это имеет смысл, это имеет смысл. В противном случае нет. –

ответ

10

Нет ничего плохого; на самом деле это обычно используемый шаблон.

Повторное исключение, обернутое в другое исключение, часто используется, когда контракт метода выдает исключение для конкретного домена, но существует конкретное исключение для реализации, к которому вы должны иметь дело, например SQLException.

public Customer getCustomer(int id) throws CustomerDataUnavailableException { 
    try { 
     // access SQL database 
     return customer; 
    } catch (SQLException e) { 
     throw new CustomerDataUnavailableException(e); 
    } 
} 

Выбор для хранения данных о клиентах в базе данных SQL является выбор реализации, которые вы не хотите, чтобы просочиться через API (бросая SQLException).

Он также упрощает изменение реализации, например, используя плоскую файловую систему на мобильном устройстве или используя NoSql db - изменение может быть внесено в метод без изменения какого-либо другого кода, поскольку контракт API является реализацией независимый.

Наконец, это облегчает тестирование и насмешку - вам не нужно бросать экзотические исключения, классы которых могут быть даже недоступны для вашего тестового кода.

+0

+1 для программирования на интерфейс и не утечки информации об осуществлении – jdphenix

+1

вы понимаете, что можете поднимать вопросы, не так ли? – user2097804

+0

http://meta.stackoverflow.com/questions/270387/are-people-voting -less- thesedays – user2097804

0

Это нормально - в соответствии с этим URL, это определяется как «прикован исключение» и это законно:

http://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html

В следующем примере показано, как использовать цепочечную исключение.

try { 

} catch (IOException e) { 
    throw new SampleException("Other IOException", e); 
} 

Я бы документировать различные типы исключений, используя @throws тег для JavaDoc. Допустимо включать несколько меток @throws для одного метода; увидеть этот URL:

Can I use multiple @throws tags for the same exception in Javadoc?

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