#java #exception-handling
#java #исключение
Вопрос:
У меня есть некоторый частный метод в классе, который имеет одинаковую обработку исключений. Их основной код вызывает одинаковые типы исключений, и обработка кода одинакова.
private void method1() { попробуйте { //make_the_world_a_better_place } catch(IOException ioe) { // ... } } частный логический метод2(строка str) { попробуйте { //make_a_cheesecake } catch(IOException ioe) { // ... } }
Какой наилучший способ экстернализировать общую обработку исключений, чтобы при внесении изменений в код обработки исключений одного из методов изменения распространялись на другие методы? Шаблон метода шаблона был бы удобен в этой ситуации, но я не хочу углубляться в иерархию классов.
РЕДАКТИРОВАТЬ: Существует несколько предложений catch, а не только одно, как в примере.
Ответ №1:
Создайте интерфейс:
public interface Executor {
void exec() throws Exception;
}
в вашем классе:
checkForExceptions(new Executor() {
@Override
public exex() throws Exception {
method1();
}
});
private void checkForExceptions(Executor ex) {
try {
ex.exec();
} catch (Exception e) [
/// handling
}
Комментарии:
1. Да, спасибо! Ваше решение является объектно-ориентированной альтернативой шаблонному методу. Но на самом деле я не хочу вводить новую иерархию классов для такой простой (?) задачи? Возможно ли повторно использовать код обработки исключений в том же классе? Я вижу, что мне нужно использовать анонимные классы, но в любом случае нужно ввести новый интерфейс.
2. Я боюсь, что нет, по крайней мере, в java 6. Если бы существовал lambda (ожидающий jdk 7), вам не понадобились бы никакие интерфейсы.
Ответ №2:
Ваш инстинкт верен — DRY — это хорошая вещь. Но не делайте этого. Ваш код будет сложнее читать.
Убедитесь, что ваши блоки catch действительно обрабатывают исключение, а не просто проглатывают его. Если ваш класс не обеспечивает исправления, я бы сказал, что было бы лучше выбросить его и позволить клиентам самим решать, что делать.
Ответ №3:
Вы можете создать handleException(IOException ioe)
метод, который они оба вызывают.
Комментарии:
1. Я думал о обработке try-catch в одном месте и логике метода между ними, но я думаю, что тогда мир был бы слишком совершенным. На самом деле у меня есть несколько предложений catch в методах…
2. Я перехватываю разные исключения и создаю пользовательское исключение во время выполнения с разными предоставленными сообщениями. Что произойдет, если это изменится в будущем? В любом случае, мой вопрос общего характера, мне любопытно узнать, как это возможно сделать на Java.
3. Мой подход состоял бы в том, чтобы не создавать пользовательские исключения, просто пропустить исходные исключения и избежать множества блоков catch здесь и там.
4. Я пытаюсь избежать проверенных исключений, создаваемых методами.
5. Можете ли вы объяснить, почему? Возможно, это то, о чем вам не нужно беспокоиться. 😉
Ответ №4:
Я думал о обработке try-catch в одном месте и логике метода между ними, но я думаю, что тогда мир был бы слишком совершенным. На самом деле у меня есть несколько предложений catch в методах.